Estado de la mezcla de multiprocesamiento y subprocesamiento en Python

¿Cuáles son las mejores prácticas o soluciones para el uso de subprocesos multiproceso y de usuario en la misma aplicación python en Linux con respecto al problema 6721, los lockings en la biblioteca estándar de python se deben limpiar en el fork?

¿Por qué necesito ambos? Utilizo procesos secundarios para realizar cálculos pesados ​​que producen resultados de la estructura de datos que son demasiado grandes para regresar a través de una cola, sino que deben almacenarse inmediatamente en el disco. Parecía eficiente tener cada uno de estos procesos secundarios monitoreados por un subproceso separado, de modo que cuando termine, el subproceso podría manejar el IO de leer los datos grandes (por ejemplo, varios GB) de nuevo en el proceso donde se necesitaba el resultado para un cálculo adicional en Combinación con los resultados de otros procesos infantiles. Los procesos secundarios se bloquearían de forma intermitente, lo que acabo de encontrar (después de mucho golpe de cabeza) fue “causado” mediante el uso del módulo de registro. Otros han documentado el problema aquí:

https://twiki.cern.ch/twiki/bin/view/Main/PythonLoggingThreadingMultiprocessingIntermixedStudy

lo que apunta a este problema de Python aparentemente no resuelto: los lockings en la biblioteca estándar de python deben desinfectarse en el fork; http://bugs.python.org/issue6721

Alarmado por la dificultad que tenía rastreando esto, respondí:

¿Hay alguna razón para no mezclar el módulo de multiprocesamiento y subprocesamiento en Python?

con la sugerencia más bien inútil de ‘Cuidado’ y enlaces a los anteriores.

Pero el extenso debate en el número 6721 sugiere que es un “error” utilizar tanto el multiprocesamiento (u os.fork) como los hilos de usuario en la misma aplicación. Con mi comprensión limitada del problema, encuentro demasiadas discrepancias en la discusión para concluir cuáles son las soluciones alternativas o las estrategias para usar multiproceso y subprocesamiento en la misma aplicación. Mi problema inmediato se resolvió al deshabilitar el registro, pero creo un pequeño puñado de otros lockings (explícitos) tanto en el proceso principal como en el secundario, y sospecho que me estoy preparando para otros lockings intermitentes.

¿Puede dar recomendaciones prácticas para evitar puntos muertos mientras usa lockings y / o el módulo de registro mientras usa el subprocesamiento y el multiprocesamiento en una aplicación de python (2.7,3.2,3.3)?

Estarás a salvo si descifras procesos adicionales mientras aún tengas solo un hilo en tu progtwig (es decir, bifurcar desde el hilo principal, antes de generar subprocesos de trabajo).

Su caso de uso parece que ni siquiera necesita un módulo de multiprocesamiento; puede utilizar un subproceso (o incluso llamadas más simples de sistema operativo).

Consulte también ¿Es seguro bifurcar dentro de un hilo?