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.Queues. 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:

  1. ¿Cómo asegurar que mis objetos pueden ser transferidos a través de la Queue? ¿Es necesario proporcionar alguna __setstate__?
  2. Puedo confiar en put volviendo al instante (como con threadings Queue)?
  3. Indicaciones generales / consejos?
  4. Cualquier cosa que vale la pena leer, aparte de la Python documentación ?
¿Fue útil?

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 tuples, lists y dicts. También clases son compatibles si son de alto nivel y no demasiado complicado (comprobar los detalles). Tratando de pasar alrededor de lambdas 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étodo task_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étodo qsize y la versión más reciente multiprocessing 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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top