efegea
25/11/2007, 18:01
A ver si podéis echarme un cable. Os cuento mi problema:
En mi media center y mi dashboard para la craiginator (comparten casi todo el código) quiero implementar un sistema de scripting usando Python. Pero quiero que éstos scripts se ejecuten en paralelo, concurrentemente, entre ellos y la aplicación principal. Éstos scripts dibujarían en la ventana de la aplicación principal, a modo de widgets (ver enlace al final de este post)
Pues bien, en Python no es posible ejecutar varios intérpretes en paralelo. Bueno, sí que se puede, claro, abriendo hilos y en cada hilo ejecutando un script, pero...no se ejecutan en paralelo, sino uno detrás de el otro, cuando termina uno se ejecuta el otro. Ésto es debido al Global Interpreter Lock, o GIL, que bloquea la ejecución de otros intérpretes de mientras se está ejecutando uno, aunque estén en distintos hilos de ejecución.
Pero necesito que se ejecuten en paralelo.
Una solución que he visto es ejecutar, en vez de como hilos separados, como procesos separados. Pero aquí se complica mucho más la cosa. ¿Cómo comunico cada proceso entre sí, o al menos cada proceso con la aplicación principal? Existe la comunicación entre procesos (IPC) pero que yo sepa es para mandar mensajes entre ellos, y no se pueden ejecutar funciones (funciones para dibujar en la ventana principal)
Podría ejecutar cada proceso con su propia ventana correspondiente, sin bordes ni barra de títulos y colocarla justo donde quiero que se dibuje, mandando las coordenadas y si debería ser visible o no vía IPC. Pero tendría que usar las funciones del administrador de ventanas y no sería portable, pues tendría que hacer una versión para X11 de linux, otra para windows, y ¿que pasa con los sistemas que no tienen gestor de ventanas?: No sería posible en esos casos. Si quisiese hacer eso en una consola, por ejemplo para dreamcast, aunque sea portarlo por diversión, no podría al no tener gestor de ventanas. Bueno, ni siquiera podría lanzar distintos procesos.
He mirado el código fuente de XBMC y no ejecuta scripts en paralelo...
No sé, ¿alguna idea?
(*) Esta imagen es un mockup del dashboard del craiginator, donde se ven los scripts en forma de widgets e iconos de la barra del sistema (hora, medidor de batería, de cobertura wifi..) Quiero que los scripts puedan dibujar en pantalla. Que por si todo esto fuera poco, encima es OpenGL (que complica aun más las cosas)
http://img80.imageshack.us/img80/9203/craiginatorhomemockupfolt6.png
< - >
Se me ha ocurrido una idea..
Tener un script principal en python que éste a su vez ejecuta los diferentes scripts en paralelo, pues usando la implementación llamada Stackless se pueden ejecutar hilos concurrentemente dentro de python (hay que diferenciar dentro de python y fuera, como en barrio sésamo, fuera es en c++ y dentro es dentro del script)
< - >
Ok, la idea funciona, ya lo tengo funcionando
Gracias a todos (d'oh!)
Usando Stackless python, en mi aplicación ejecuto un script. Ese script llama a otros dos scripts usando lo denominado "tasklets" y los ejecuta. Y sí, funciona concurrentemente :)
En mi media center y mi dashboard para la craiginator (comparten casi todo el código) quiero implementar un sistema de scripting usando Python. Pero quiero que éstos scripts se ejecuten en paralelo, concurrentemente, entre ellos y la aplicación principal. Éstos scripts dibujarían en la ventana de la aplicación principal, a modo de widgets (ver enlace al final de este post)
Pues bien, en Python no es posible ejecutar varios intérpretes en paralelo. Bueno, sí que se puede, claro, abriendo hilos y en cada hilo ejecutando un script, pero...no se ejecutan en paralelo, sino uno detrás de el otro, cuando termina uno se ejecuta el otro. Ésto es debido al Global Interpreter Lock, o GIL, que bloquea la ejecución de otros intérpretes de mientras se está ejecutando uno, aunque estén en distintos hilos de ejecución.
Pero necesito que se ejecuten en paralelo.
Una solución que he visto es ejecutar, en vez de como hilos separados, como procesos separados. Pero aquí se complica mucho más la cosa. ¿Cómo comunico cada proceso entre sí, o al menos cada proceso con la aplicación principal? Existe la comunicación entre procesos (IPC) pero que yo sepa es para mandar mensajes entre ellos, y no se pueden ejecutar funciones (funciones para dibujar en la ventana principal)
Podría ejecutar cada proceso con su propia ventana correspondiente, sin bordes ni barra de títulos y colocarla justo donde quiero que se dibuje, mandando las coordenadas y si debería ser visible o no vía IPC. Pero tendría que usar las funciones del administrador de ventanas y no sería portable, pues tendría que hacer una versión para X11 de linux, otra para windows, y ¿que pasa con los sistemas que no tienen gestor de ventanas?: No sería posible en esos casos. Si quisiese hacer eso en una consola, por ejemplo para dreamcast, aunque sea portarlo por diversión, no podría al no tener gestor de ventanas. Bueno, ni siquiera podría lanzar distintos procesos.
He mirado el código fuente de XBMC y no ejecuta scripts en paralelo...
No sé, ¿alguna idea?
(*) Esta imagen es un mockup del dashboard del craiginator, donde se ven los scripts en forma de widgets e iconos de la barra del sistema (hora, medidor de batería, de cobertura wifi..) Quiero que los scripts puedan dibujar en pantalla. Que por si todo esto fuera poco, encima es OpenGL (que complica aun más las cosas)
http://img80.imageshack.us/img80/9203/craiginatorhomemockupfolt6.png
< - >
Se me ha ocurrido una idea..
Tener un script principal en python que éste a su vez ejecuta los diferentes scripts en paralelo, pues usando la implementación llamada Stackless se pueden ejecutar hilos concurrentemente dentro de python (hay que diferenciar dentro de python y fuera, como en barrio sésamo, fuera es en c++ y dentro es dentro del script)
< - >
Ok, la idea funciona, ya lo tengo funcionando
Gracias a todos (d'oh!)
Usando Stackless python, en mi aplicación ejecuto un script. Ese script llama a otros dos scripts usando lo denominado "tasklets" y los ejecuta. Y sí, funciona concurrentemente :)