2009-10-14 11 views

Respuesta

17

subclases Queue es probablemente la mejor manera. Algo como esto debería funcionar (no probado):

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

Gracias! ¿De dónde sacaste información sobre all_task_done? Busqué en http://docs.python.org/library/queue.html#module-Queue pero no veo ninguna mención de ese memeber ... – olamundo

+3

Puede leer el código fuente de Queue. Tiene un parámetro 'timeout' implementado para' put' y 'get', fue bastante fácil extender' join' para usar un enfoque similar. –

+0

Hmm, solución inteligente;) – tuergeist

0

En primer lugar, debe asegurarse de que todos los hilos de trabajo en la salida de la cola con task_done()

para implementar una funcionalidad de tiempo de espera con Queue, se puede envolver el código de la cola en un hilo y añadir un tiempo de espera para este Tema usando Thread.join([timeout])

ejemplo no probado para delinear lo que sugieren

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

El join() método se trata de esperar a que todas las tareas a realizar. Si no le importa si las tareas realmente han terminado, puede sondear periódicamente el recuento tarea inacabada:

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

existirá Este bucle o bien cuando las tareas se llevan a cabo o cuando haya transcurrido el período de tiempo de espera.

Raymond

Cuestiones relacionadas