Quiero un proceso de larga duración para devolver su progreso a través de una cola (o algo similar) que alimentaré a un cuadro de diálogo de barra de progreso. También necesito el resultado cuando el proceso se completa. Aquí falla un ejemplo de prueba con RuntimeError: Queue objects should only be shared between processes through inheritance
.¿Cómo se pasa una referencia de cola a una función administrada por pool.map_async()?
import multiprocessing, time
def task(args):
count = args[0]
queue = args[1]
for i in xrange(count):
queue.put("%d mississippi" % i)
return "Done"
def main():
q = multiprocessing.Queue()
pool = multiprocessing.Pool()
result = pool.map_async(task, [(x, q) for x in range(10)])
time.sleep(1)
while not q.empty():
print q.get()
print result.get()
if __name__ == "__main__":
main()
he sido capaz de conseguir que esto funcione utilizando objetos individuales del proceso (en el que estoy alowed a pasar una referencia de cola), pero entonces no tener una piscina para manejar los muchos procesos que quiero almorzar. ¿Algún consejo sobre un mejor patrón para esto?
No es una respuesta a su pregunta, pero intente con la biblioteca 'execnet' para asignaciones multiproceso. El 'multiprocesamiento' integrado aún tiene algunos problemas por resolver (ver el rastreador de Python). Además de que su código fuente es bastante grande y complicado. La biblioteca 'execnet' se ve mucho mejor para mí que' multiprocesamiento'. –