Cómo convertir código enhebrado Python para multiprocesamiento código?
-
28-09-2019 - |
Pregunta
necesito para convertir una aplicación threading
a una aplicación multiprocessing
por múltiples razones (GIL), pérdidas de memoria. Afortunadamente los hilos son bastante aislado y sólo se comunican a través Queue.Queue
s. Esta primitiva también está disponible en multiprocessing
así que todo se ve bien. Ahora antes de entrar en este campo de minas que me gustaría obtener algunos consejos sobre las próximas problemas:
- ¿Cómo asegurar que mis objetos pueden ser transferidos a través de la
Queue
? ¿Es necesario proporcionar alguna__setstate__
? - Puedo confiar en
put
volviendo al instante (como conthreading
sQueue
)? - Indicaciones generales / consejos?
- Cualquier cosa que vale la pena leer, aparte de la Python documentación ?
Solución
Respuesta a la parte 1:
Todo lo que tiene que pasar a través de un multiprocessing.Queue
(o Pipe
o lo que sea) tiene que ser estibables . Esto incluye los tipos básicos como tuple
s, list
s y dict
s. También clases son compatibles si son de alto nivel y no demasiado complicado (comprobar los detalles). Tratando de pasar alrededor de lambda
s fallará sin embargo.
Respuesta a la parte 2:
A put
consta de dos partes: Se necesita un semáforo para modificar la cola y que opcionalmente se inicia un hilo de alimentación. Así que si no hay otros intentos Process
a put
a la misma Queue
al mismo tiempo (por ejemplo, porque no hay una sola escritura Process
a ella), debe ser rápido. Para mí resultó ser lo suficientemente rápido como para todos los fines prácticos.
respuesta parcial a la parte 3:
- El
multiprocessing.queue.Queue
llanura carece de un métodotask_done
, por lo que no se puede utilizar como una gota en el reemplazo directamente. (A subclase proporciona el método.) - La edad
processing.queue.Queue
carece de un métodoqsize
y la versión más recientemultiprocessing
es inexacta (apenas tenga esto en cuenta). - Desde filedescriptors normalmente heredan en
fork
, las necesidades de atención que deben tomarse sobre el cierre en los procesos adecuados.