2012-01-16 17 views
5

Her saniyede üç işlevi (her biri yürütmek için 1 saniyeye kadar sürebilir) çalışıyorum. Daha sonra çıkışı her işlevden saklamak ve bunları ayrı dosyalara yazmak istiyorum.Her saniyede birden çok işlev çalıştırın, sonucu dosyaya yaz

Şu anda gecikme işlemimde Timer s kullanıyorum. (Ben Thread Alt sınıf, ama bu bu basit komut dosyası için karmaşık biraz gidiyor)

def main: 
    for i in range(3): 
     set_up_function(i) 
     t = Timer(1, run_function, [i]) 
     t.start() 
    time.sleep(100) # Without this, main thread exits 

def run_function(i): 
    t = Timer(1, run_function, [i]) 
    t.start() 
    print function_with_delay(i) 

function_with_delay çıktı işlemek için en iyi yolu nedir? Her bir işlev için sonucu genel bir listeye ekleyiniz mi?

... 
while True: 
    time.sleep(30) # or in a try/except with a loop of 1 second sleeps so I can interrupt 
    for i in range(3): 
     save_to_disk(data[i]) 

Düşünceler:

Sonra benim ana işlevi sonunda böyle bir şey koymak olabilir?


Düzenleme: fonksiyon çalışması bittikten ve str çıkışı olup olmadığını bool bir olasılık ben dükkanını listelerinin bir listesini söyleyebilirim

cevap

7

Python Queue modülünün tam olarak bu tür bir senaryo için tasarlandığına inanıyorum. Örneğin, böyle bir şey yapabileceğini:

def main(): 
    q = Queue.Queue() 
    for i in range(3): 
     t = threading.Timer(1, run_function, [q, i]) 
     t.start() 

    while True: 
     item = q.get() 
     save_to_disk(item) 
     q.task_done() 

def run_function(q, i): 
    t = threading.Timer(1, run_function, [q, i]) 
    t.start() 
    q.put(function_with_delay(i)) 
+1

+1 Bu, çıktı dosyaları ayırmak olduğundan dolayı çalışır. Önemsiz ve çıktıların bir birleşimini içeriyorsa, sıraya konulan öğelerin tümünü yazmadan önce bitirmesini beklemeniz gerekir. Ayrıca aldığınız öğelerde 'task_done 'öğesini seçtiğinizden emin olun. – darvids0n

+0

Harika bir fikir! Kuyruk iş parçacığı için güvenli ve list.append (veri) –

+0

çok güzel. Darvids0n tarafından önerilen şekilde "task_done" aramasına ekledim. Teşekkürler. – srgerg

1

(bool, str) gibi kendi cevap eklendi. Her işlev, listeyi çıktı eklemek için bir mutex ile kilitler (ya da iş parçacığı güvenliği ile ilgilenmezseniz). Daha sonra, tüm bool değerlerinin True olup olmadığını kontrol etmek için basit bir yoklama döngüsüne sahip olursunuz ve eğer öyleyse save_to_disk çağrılarınızı yapın.

0

diğer alternatif threading.Lock() kullanır (this answer alınan) bir sınıf uygulamak olacaktır. Bu, ItemStore üzerinde bekleyebilmenin avantajına sahiptir ve save_to_disk, kuyruğu sorgulamak yerine getAll'u kullanabilir. (Büyük veri kümeleri için daha verimli?)

Bu, özellikle saniyede bir kez değil, belirli bir zaman aralığında (yani her 30 saniyede) yazmak için uygundur.

class ItemStore(object): 
    def __init__(self): 
     self.lock = threading.Lock() 
     self.items = [] 

    def add(self, item): 
     with self.lock: 
      self.items.append(item) 

    def getAll(self): 
     with self.lock: 
      items, self.items = self.items, [] 
     return items 
İlgili konular