Acabo de descubrir un error extraño en mi programa relacionado con su uso del módulo de multiprocesamiento de Python. Todo funciona bien cuando ejecuto el programa desde la fuente en mi máquina. Pero lo he estado construyendo en un ejecutable usando el instalador de piro, y por alguna razón el comportamiento del multiprocesamiento cambia drásticamente cuando ejecuto el ejecutable creado a partir de mi código. Específicamente, cuando intento ejecutar la parte de multiprocesamiento de mi código, en lugar de hacer lo que se supone que debe hacer, aparece lo que parece ser una copia de la ventana principal de mi programa, una para cada proceso. Peor aún, vuelven a abrir si se cierran manualmente, presumiblemente porque son parte de un multiprocesamiento. No se imprimen mensajes de error, y una vez creadas todas las ventanas se quedan allí sin hacer nada. ¿Qué podría estar pasando para causar esto?Python - Multiprocesamiento.procesos se convierten en copias del proceso principal cuando se ejecutan desde el ejecutable
Respuesta
En Windows multiprocessing
, trata de emular la llamada al sistema Unix fork()
iniciando nuevas instancias de su ejecutable, y ejecutar la rutina de proceso hijo (multiprocessing.forking.main()
) en su interior. Con el intérprete estándar de Python (python.exe
), multiprocessing
puede pasar el parámetro -c
para ejecutar código personalizado. Para ejecutables personalizados, sin embargo, esto no es posible, ya que probablemente el ejecutable no admita las mismas opciones de línea de comando que python.exe
.
La función freeze_support()
evita este problema ejecutando explícitamente la rutina de proceso secundario y termina el intérprete llamando al sys.exit()
. Si olvida llamar al freeze_support()
, el nuevo proceso no sabe que es un proceso secundario y ejecuta la lógica de la aplicación principal. En su caso, esto abrirá otra ventana principal de la GUI.
Desde el inicio de un nuevo proceso hijo del proceso recién creado hará que la recursividad infinita, multiprocessing
intenta evitar que esto comprobando el atributo sys.frozen
y formar una RuntimeError
si freeze_support()
no fue llamado. En su caso, parece que se requiere la interacción del usuario para engendrar los procesos, por lo tanto, no hay recursión infinita ni RuntimeError
.
Por convenio, sys.frozen
solo está configurado para los ejecutables generados automáticamente creados por py2exe
o PyInstaller. Es importante comprender esta lógica y establecer sys.frozen
en True
cuando desee incrustar Python en un archivo ejecutable personalizado que permita el multiprocesamiento en Windows.
- 1. ¿matar el subproceso cuando se mata el proceso de python?
- 2. Android: Nuevo subproceso Ejecutable se ejecuta en el subproceso principal
- 3. GDB adjuntándose a un proceso donde se eliminó el ejecutable
- 4. Manejando el hilo principal del proceso
- 5. Tamaño del proceso en XP desde Python
- 6. Obtener el encabezado ELF del ejecutable principal
- 7. ¿Cómo encontrar la ruta desde donde se ejecuta el proceso/ejecutable actual?
- 8. La alarma en el AlarmManager se borra cuando se mata el proceso
- 9. Las consultas de MySQL son rápidas cuando se ejecutan directamente pero realmente son lentas cuando se ejecutan como proc almacenado
- 10. ¿Por qué las citas se convierten en divertidos personajes cuando se envían en un formulario HTML?
- 11. ¿Cómo se determina el tamaño del proceso?
- 12. iOS ¿Los métodos invocados por los delegados y observadores se ejecutan en el hilo principal?
- 13. FileNotFoundException cuando se ejecutan las pruebas de NUnit de TeamCity
- 14. Las funciones de Android JNI se ejecutan en el hilo principal?
- 15. se ejecutan múltiples servidores Tomcat
- 16. ¿Por qué mis escenarios de pepino fallan cuando los pasos se ejecutan juntos, pero pasan cuando se ejecutan singularmente?
- 17. ¿Qué sucede cuando un proceso se bifurca?
- 18. Visual Studio: adjuntar automáticamente a un proceso cuando se genera el proceso
- 19. ¿Cómo se ejecutan guiones jython multiproceso desde Java?
- 20. ¿Obtiene el nombre del proceso actual (ejecutable) en Go?
- 21. ¿Diferencia entre procesos que se ejecutan en modo kernel y se ejecutan como raíz?
- 22. Cuando un proceso principal es asesinado por "kill -9", ¿también se matará el subproceso?
- 23. Subprocesos GAE python que no se ejecutan en paralelo
- 24. ¿Cómo se copia el código de objeto en ejecutable cuando se enlaza con la biblioteca estática?
- 25. Código de salida del proceso cuando se mata el proceso forzosamente
- 26. Las pruebas unitarias no se ejecutan cuando NO está en el modo de depuración
- 27. Ejecutando ejecutable desde la memoria
- 28. ¿Cómo se ejecutan los archivos ejecutables en Windows 7 utilizando el símbolo del sistema?
- 29. ¿Por qué se ejecutan las funciones no anónimas cuando se utiliza el controlador de eventos click?
- 30. Scripts de perfiles de Python que se ejecutan en mod_wsgi
Lo encontré - al parecer, el multiprocesamiento está muy por delante de mí. Para cualquiera que se lo pregunte, todo lo que necesitaba era llamar a freeze_support(). http://docs.python.org/library/multiprocessing.html#multiprocessing.freeze_support Aunque se supone que debe generar un RuntimeError inmediatamente, entonces no estoy seguro de por qué se ejecutó ... – dpitch40