2009-10-14 4 views

Répondre

17

Subclassing Queue est probablement le meilleur moyen. Quelque chose comme cela devrait fonctionner (non testé):

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

Merci! Où avez-vous reçu des informations sur all_task_done? J'ai regardé dans http://docs.python.org/library/queue.html#module-Queue mais je ne vois aucune mention de ce memeber ... – olamundo

+3

Vous pouvez lire le code source de la file d'attente. Il a un paramètre 'timeout' implémenté pour' put' et 'get', il était assez facile d'étendre' join' pour utiliser une approche similaire. –

+0

Hmm, solution intelligente;) – tuergeist

0

Tout d'abord, vous devez vous assurer que tous vos fils de travail dans la sortie de file d'attente avec task_done()

Pour mettre en œuvre une fonctionnalité de délai d'attente avec Queue, vous pouvez envelopper le code de la file d'attente dans un thread et ajouter un délai d'attente pour cette discussion à l'aide Thread.join([timeout])

exemple non testé pour décrire ce que je suggère

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

La méthode join() est tout au sujet d'attente pour toutes les tâches à accomplir. Si vous ne vous inquiétez pas si les tâches ont effectivement terminé, vous pouvez interroger périodiquement le nombre de tâches inachevées:

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

Cette boucle existera soit lorsque les tâches sont effectuées ou lorsque le délai d'attente est écoulé.

Raymond

Questions connexes