Recuento del número total de tareas ejecutadas en un multiproceso. Trabajo durante la ejecución

Me encantaría dar una indicación de la charla actual en total que estamos solo. Estoy trabajando en el campo y me gustaría saber el progreso actual. Entonces, si envié 100 trabajos a 10 procesadores, ¿cómo puedo mostrar cuál es el número actual de trabajos que han regresado? Puedo obtener los ID, pero ¿cómo puedo contar la cantidad de trabajos devueltos completados desde mi función de mapa?

Estoy llamando a mi función como la siguiente:

 op_list = pool.map(PPMDR_star, list(varg)) 

Y en mi función puedo imprimir el nombre actual.

 current = multiprocessing.current_process() print 'Running: ', current.name, current._identity 

Si usa pool.map_async , puede extraer esta información de la instancia de MapResult que se devuelve. Por ejemplo:

 import multiprocessing import time def worker(i): time.sleep(i) return i if __name__ == "__main__": pool = multiprocessing.Pool() result = pool.map_async(worker, range(15)) while not result.ready(): print("num left: {}".format(result._number_left)) time.sleep(1) real_result = result.get() pool.close() pool.join() 

Salida:

 num left: 15 num left: 14 num left: 13 num left: 12 num left: 11 num left: 10 num left: 9 num left: 9 num left: 8 num left: 8 num left: 7 num left: 7 num left: 6 num left: 6 num left: 6 num left: 5 num left: 5 num left: 5 num left: 4 num left: 4 num left: 4 num left: 3 num left: 3 num left: 3 num left: 2 num left: 2 num left: 2 num left: 2 num left: 1 num left: 1 num left: 1 num left: 1 

multiprocessing interno rompe lo iterable que se pasa para map en partes, y pasa cada parte a los procesos secundarios. Por lo tanto, el atributo _number_left realmente hace un seguimiento del número de trozos restantes, no de los elementos individuales en el iterable. Tenga esto en cuenta si ve números de aspecto extraño cuando usa iterables grandes. Utiliza chunking para mejorar el rendimiento de IPC, pero si es más importante para usted ver un recuento preciso de los resultados completados que el rendimiento agregado, puede usar el chunksize=1 palabra clave chunksize chunksize=1 para map_async para hacer que _num_left más preciso. (El chunksize generalmente solo hace una diferencia notable en el rendimiento para iterables muy grandes. Pruébelo usted mismo para ver si realmente importa con su caso de uso).

Como mencionó en los comentarios, debido a que pool.map está bloqueando, realmente no puede obtener esto a menos que inicie un subproceso en segundo plano que realizó el sondeo mientras que el subproceso principal se bloqueó en la llamada del map , pero no estoy seguro de que haya Cualquier beneficio para hacerlo sobre el enfoque anterior.

La otra cosa que debes tener en cuenta es que estás usando un atributo interno de MapResult , por lo que es posible que esto se pueda romper en futuras versiones de Python.