2009-10-14 11 views

cevap

17

Subclassing Queue muhtemelen en iyi yoldur. Böyle bir şey (denenmemiş) çalışması gerekir:

def join_with_timeout(self, timeout): 
    self.all_tasks_done.acquire() 
    try: 
     endtime = time() + timeout 
     while self.unfinished_tasks: 
      remaining = endtime - time() 
      if remaining <= 0.0: 
       raise NotFinished 
      self.all_tasks_done.wait(remaining) 
    finally: 
     self.all_tasks_done.release() 
+1

Teşekkür sağlamak istiyorum! All_task_done hakkında nereden bilgi aldınız? Ben http://docs.python.org/library/queue.html#module-Queue baktım ama bu memeber herhangi bir söz görmüyorum ... – olamundo

+3

Kuyruk için kaynak kodunu okuyabilirsiniz. Bu 'koymak' ve 'almak' için uygulanan bir 'timeout' parametresi vardır, benzer bir yaklaşım kullanmak için 'katılmak' genişletmek için yeterince kolay oldu. –

+0

Hmm, akıllı çözüm;) – tuergeist

0

İlk başta, bir Thread Queue kodunu sarar task_done()

ile kuyruk çıkışında tüm çalışma ipler Queue ile bir zaman aşımı işlevselliğini uygulamak için emin olmalıdır ve kullanma Bu Konudaki bir zaman aşımı eklemek

denenmemiş örnek Thread.join([timeout]) önerim özetlemek

def worker(): 
    while True: 
     item = q.get() 
     do_work(item) 
     q.task_done() 

def queuefunc(): 
    q = Queue() 
    for i in range(num_worker_threads): 
     t = Thread(target=worker) 
     t.setDaemon(True) 
     t.start() 

    for item in source(): 
     q.put(item) 

    q.join()  # block until all tasks are done 

t = Thread(target=queuefunc) 
t.start() 
t.join(100) # timeout applies here 
10

() yöntem Bütün görevler bekliyor konuda yapılması gereken edilir katılmak. Eğer görevleri fiilen bitmiş umrumda yoksa, belirli aralıklarla tamamlanmamış görev sayımını yoklamak:

stop = time() + timeout 
while q.unfinished_tasks and time() < stop: 
    sleep(1) 

Bu döngü var olacaktır, ya görevler bittiğinde veya zaman aşımı süresi dolduğunda.

Raymond