Deseo poder unir() la clase Queue pero el tiempo de espera después de un tiempo si la llamada aún no ha regresado. ¿Cuál es la mejor manera de hacerlo? ¿Es posible hacerlo subclasando queue \ using metaclass?Agregue el argumento de timeout a Queue.join() de Python()
Respuesta
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()
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
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. –
Hmm, solución inteligente;) – tuergeist
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
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
- 1. Agregue argumento adicional a un NSPredicate existente
- 2. Agregue el parámetro de codificación a logging.basicConfig
- 3. Llamar a WCF TimeOut
- 4. método de python como argumento
- 5. Python argparse - Agregar argumento a múltiples subparsers
- 6. Agregue el parámetro a dataAdapter.fill()
- 7. argumento vacío python
- 8. Python - lista de tuplas de función/argumento
- 9. Errores de argumento de Python ctypes
- 10. 'rescatar en rbuf_fill': Timeout :: Error (Timeout :: Error)
- 11. ¿Cómo resolver el problema expirado de TimeOut?
- 12. Acceso a los valores de argumento predeterminados en Python
- 13. WCF Servicio de Windows TimeOut
- 14. Agregue el puntero C a NSMutableArray
- 15. Agregue el mismo método a varias clases
- 16. matplotlib: agregue el círculo a la gráfica
- 17. Agregue el atributo 'memberOf' a ApacheDS
- 18. Python funciona como un argumento de función?
- 19. ¿Cuál es la diferencia entre Thread.Sleep (timeout) y ManualResetEvent.Wait (timeout)?
- 20. diferencia entre WebDriver Wait timeout y implicitlyWait timeout?
- 21. Django: agregue un campo a un modelo
- 22. Django cómo volver a conectar después de DatabaseError: query timeout
- 23. BroadcastReceiver onReceive timeout
- 24. http connection timeout issues
- 25. shell_exec() timeout management & exec()
- 26. maneja lwp timeout efectivamente
- 27. Silverlight ClientHttp WebRequest timeout
- 28. Capistrano Deploy Timeout
- 29. Silverlight Async Timeout Error
- 30. Solución de problemas de SQL Server Timeout
Se podría asegurar que todos los fines subproceso de trabajo con task_done() – tuergeist