multiprocesamiento - paralelizar en python
problema de multiprocesamiento (3)
"La funcionalidad dentro de este paquete requiere que el método principal sea importable por los niños".
Creo que esto significa que tienes que tener la función main () definida en algún lugar.
Estoy escribiendo un programa GUI usando PyQt4. Hay un botón en mi ventana principal y al hacer clic en este botón. Espero lanzar un proceso en segundo plano que sea una instancia de una clase derivada de processing.Process.
class BackgroundTask(processing.Process):
def __init__(self, input):
processing.Process.__init__(self)
...
def run(self):
...
(Tenga en cuenta que estoy usando el puerto Python2.5 del multiproceso Python obtenido de http://code.google.com/p/python-multiprocessing/ es por eso que está procesando.Proceso en lugar de multiproceso.Proceso. Supongo que Esto no debería hacer una diferencia. ¿Tengo razón?)
El código conectado a la señal de clic del botón es algo así como
processing.freezeSupport()
task = BackgroundTask(input)
task.start()
El programa funciona como se espera bajo el intérprete de python, es decir, si se inicia desde la línea de comandos "python myapp.py".
Sin embargo, después de empaquetar el programa usando py2exe, cada vez que hago clic en ese botón, en lugar de iniciar la tarea en segundo plano, aparece una copia de la ventana principal. No estoy seguro de cuál es la razón de este comportamiento. Supongo que está relacionado con la siguiente nota dirigida en http://docs.python.org/library/multiprocessing.html#multiprocessing-programming
"La funcionalidad dentro de este paquete requiere que el método principal sea importable por los niños. Esto está cubierto en las pautas de programación, sin embargo, vale la pena señalarlo aquí. Esto significa que algunos ejemplos, como el multiprocesamiento. Los ejemplos sencillos no funcionarán en el intérprete interactivo. "
El único lugar que tengo si el nombre == " main " está en el módulo principal como en un programa típico de pyqt
if __name__ == "__main__":
a = QApplication(sys.argv)
QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
w = MainWindow()
w.show()
a.exec_()
¿Alguna solución sobre cómo solucionar este problema? ¡Gracias!
Creo que tu problema real tiene que ver con esto:
El programa funciona como se espera bajo el intérprete de python, es decir, si se inicia desde la línea de comandos "python myapp.py".
Sin embargo, después de empaquetar el programa usando py2exe, cada vez que hago clic en ese botón,> en lugar de iniciar la tarea en segundo plano, aparece una copia de la ventana principal.
Debe agregar una llamada especial a la función freeze_support () para hacer que el módulo de multiprocesamiento funcione con ejecutables "congelados" (por ejemplo, los creados con py2exe):
if __name__ == "__main__":
# add freeze support
processing.freeze_support()
a = QApplication(sys.argv)
QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
w = MainWindow()
w.show()
a.exec_()
Referencia: http://docs.python.org/library/multiprocessing.html#multiprocessing.freeze_support
La pregunta es sobre Python 2 y fue resuelta. Para Python 3, se vería como:
from multiprocessing import freeze_support
if __name__ == ''__main__'':
freeze_support()
a = QApplication(sys.argv)
...