PDA

Ver la versión completa : Python: ejecutar varios scripts en paralelo



efegea
19/12/2007, 22:52
En realidad este no es el subforo correspondiente, pero como no tenemos un general de programación, creo que es mejor postearlo aquí. No es exactamente para GP2X, pero también sirve.

Bien, os traigo un pequeño ejemplo de cómo ejecutar varios scripts (cuantos querais) de python en paralelo, a la vez que se sigue ejecutando el código en C/C++, también en paralelo. Además incluye código para limitar los frames por segundo y así no consumir el 100% de cpu.

Usa Stackless Python (http://www.stackless.com/), que es una implementación de python distinta a la estándar. ¡Esto es importante! No sirve el python estándar, pues éste no incluye soporte de tasklets.

Está diseñado para linux. No creo que sea muy difícil adaptarlo a otra plataforma. Usa hilos posix y unas funciones extra que he añadido para poder detener el programa pulsando una tecla, ya que en linux no sirve getc(), porque el programa se detiene hasta que pulses intro.

Yo lo he compilado así, pero seguramente en vuestro equipo sea distinto:


g++ python_example.cpp -o python_example -lpthread -ldl -lutil -lpython2.4 -lm -L/home/frajan/stackless/lib/python2.4/config -I/home/frajan/stackless/include/python2.4/ -Wl,--export-dynamic -Wall

NECESITO QUE: los que lo probéis deis vuestra opinion, todo lo que veáis que esté mal programado, cualquier mejora, comentadmelo, esa será mi licencia :D

Y necesito que lo probéis, hacedme ese favor, please :brindis:

Preguntadme y comentarme cualquier cosa que queráis, siempre que esté relacionada con el ejemplo ^_^

davidgutierrez
20/12/2007, 00:04
Jejeje, esto tiene pinta de ser muy muy interesante... ahora mismo estoy sin tiempo disponible entre el curro y las compras navideñas, pero este sábado empiezan mis vacaciones y en cuanto termine de resolver un par de temas pendientes con mi Sliding Puzzle me dedicaré a hacer pruebecitas con esto, que parece muy interesante. Hasta entonces no tendré demasiado tiempo como para mirarme los ejemplos, así que no me lo eches en cara si pregunto alguna tonteria...

Dices que se trata de una implementación distinta de Python, pero supongo que aunque la implementación sea distinta servirá el mismo código fuente de "Python normal" ¿o tengo que hacer algo especial para que funcione con esta implementación? ¿Podemos utilizar la librería Pygame que ya tenemos compilada con la "versión normal" de Python o habría que adaptarla o recompilarla para que funcione con esta versión? ¿Es fácil el paso de información y la sincronización entre hilos?


¿Qué es lo que quieres que probemos? ¿La parte de lanzar los scripts Python o "absolutamente todo"? Si hay que probarlo "todo", ¿serviría mi jueguecillo para hacer las pruebas o debería de intentar crear una especie de demo o banco de pruebas específico?

¡Buen trabajo!

efegea
20/12/2007, 14:28
El código fuente escrito para Python normal es 100% compatible con Stackless.

No sé como será la librería PyGame, si son módulos escritos en C, supongo que sí. Me imagino que con copiar la librería al directorio de módulos de stackless funcionará, no haría falta modificación en la librería en sí, la diferencia es que en vez de ejecutar el python estándar ejecutas python stackless. Bueno, en realidad no ejecutas ninguno de los dos, pues está "embebido" en el código C. Voy a intentar explicarme mejor:

En un programa python normal y corriente, ejecutas el intérprete python (p.ej /usr/bin/python) con tu script como parámetro.

En mi ejemplo, el interprete es el propio código en C que incluyo, por lo que ejecutas el programa que compilas junto a un script principal el cual llama a los distintos scripts que quieres ejecutar en paralelo. Eso en mi ejemplo, claro que puedes modificarlo para que actúe de otra forma.

En mi ejemplo puedes tener código en C/C++ ejecutandose de mientras que en otro hilo se ejecutan los scripts en python, todo simultáneamente.

Lo que quiero es que si podeís, pues probéis e intentéis analizar mi código para entenderlo y si encontráis algún problema comentarmelo para mejorarlo. Es que muchas de las cosas que implemento en mi código es la primera vez que las uso, como por ejemplo los hilos posix, o Python, que soy completamente nuevo en python, acabo de empezar a aprenderlo.

No creo que tu juego sirva así directamente, sin modificar, tendrías que analizar mi código y ver cómo adaptarlo a tu juego. Porque..¿porqué quieres aplicarle ésto a tu juego? ¿qué quieres hacerle?

¡Ah! Para aplicarlo a tu juego quizás sea más sencillo no usar el código en C que incluyo y usar directamente el intérprete python stackless. Lo digo porque tú no tienes código en C, por lo que no lo necesitas. Olvida mi código en C (pero miralo si quieres) y analiza los scripts python. Lo más importante está en main_script.py, los otros dos ficheros .py son los scripts que lanzo, que también tienen unas funciónes importantes: BeNice() y Sleep().

davidgutierrez
20/12/2007, 15:48
Bueno, la idea de utilizar mi juego era principalmente por 3 motivos:

1) Comprobar la robustez y la velocidad (de lo poco que use) del intérprete de python stackless respecto al de python normal.

2) En algun post ya comenté que me parecían excesivos los 5 segundos con la pantalla en negro que tarda el interprete de python normal en arrancar. Si este nuevo intérprete tarda menos tiempo en arrancar creo que empezaré a usar (y recomendar) este.

3) En el caso de que ambos tarden más o menos lo mismo en arrancar, puedo crear un "launcher" en C++ que muestre la pantalla de título usando SDL mientras se va cargando el intérprete de python stackless en background. Tal vez tarde lo mismo pero el usuario no se queda 5 segundos mirando una pantalla en negro, al menos tiene algún dibujito.


Esas son las posibles ventajas inmediatas que le veo para mi juego. Ya otra cosa sería hacer juegos en C++ pensando específicamente para hacer uso de Python stackless como lenguaje de scripting para programar la IA y cosas por el estilo. Supongo que eso llevaría algo más de tiempo de probar, pero se pueden obtener resultados realmente interesantes. Si estás interesado en hacer alguna cosilla de este estilo, tal vez podríamos formar un equipo de desarrollo, que yo mi jueguecillo de puzzle lo he hecho como "práctica para aprender Python" pero quiero empezar a hacer cositas "algo más serias".


Edit
-------------
¿Usas hilos posix? Hablo desde la ignorancia en este caso, pero... ¿no hay ninguna librería de Thread que sea multiplataforma y que pudieras usar en su lugar? Lo digo porque estaría bien poder portar cualquier cosita que se hiciese a Windows (yo solo lo uso como "consola de videojuegos para aquellos que no me funcionan con Wine", pero la mayoría de la gente sí que lo usa). No le tengo ninguna estima al sistema operativo de Microsoft, pero si me decidí a usar Python fue por su simplicidad y sobre todo por ser multiplataforma (no me agrada la idea de descartar a priori a un número tan grande de posibles jugadores).

efegea
20/12/2007, 17:32
Esas son las posibles ventajas inmediatas que le veo para mi juego. Ya otra cosa sería hacer juegos en C++ pensando específicamente para hacer uso de Python stackless como lenguaje de scripting para programar la IA y cosas por el estilo. Supongo que eso llevaría algo más de tiempo de probar, pero se pueden obtener resultados realmente interesantes. Si estás interesado en hacer alguna cosilla de este estilo, tal vez podríamos formar un equipo de desarrollo, que yo mi jueguecillo de puzzle lo he hecho como "práctica para aprender Python" pero quiero empezar a hacer cositas "algo más serias".


Eso de formar un equipo de desarrollo, complicado lo veo, por dos motivos, primero porque tengo ya muchos proyectos en marcha y no puedo meterme en otro más, me gustaría terminar antes los que tengo pendientes, y segundo porque si precisamente esos proyectos nunca les dedico tiempo, no puedo comprometerme con nadie a hacer algo que luego no voy a poder dedicarle tiempo ya sea por un motivo u otro.


Edit
-------------
¿Usas hilos posix? Hablo desde la ignorancia en este caso, pero... ¿no hay ninguna librería de Thread que sea multiplataforma y que pudieras usar en su lugar? Lo digo porque estaría bien poder portar cualquier cosita que se hiciese a Windows (yo solo lo uso como "consola de videojuegos para aquellos que no me funcionan con Wine", pero la mayoría de la gente sí que lo usa). No le tengo ninguna estima al sistema operativo de Microsoft, pero si me decidí a usar Python fue por su simplicidad y sobre todo por ser multiplataforma.

Pues no me lo he planteado porque quería que fuese un ejemplo lo más sencillo posible, aunque eso lo limitase a usuarios de linux. Generalmente sí suelo hacer mis proyectos lo más multiplataforma posible, es algo que me encanta :)

Cuando estaba aprendiendo a hacer el ejemplo este, encontré un código que hacía algo parecido pero para windows, y no había mucha diferencia, salvo en los nombres de funciones y poco más. Ten en cuenta que no uso ningún tipo de comunicación entre hilos ni mutexes ni nada de eso, sólo lanzar un hilo y luego esperar a que termine, lo que es muy fácil de portar a windows.

juanvvc
20/12/2007, 18:01
En el caso de que ambos tarden más o menos lo mismo en arrancar, puedo crear un "launcher" en C++ que muestre la pantalla de título usando SDL mientras se va cargando el intérprete de python stackless en background.

Oye, esto mismo también lo pensé yo para hacer estas navidades :) Se me ocurren dos maneras:

1.- En el script lanzador .gpe, hacer algo como:


display titlescreen.png
python -oo blablabla.py

2.- En el propio código Python, la primera línea antes de ningún otro import (display es una librería Python hecha en C/C++)


import display; display.show('titlescreen.png')

La primera es más fácil e inmediata, pero no sé si al salir de la aplicación 'display' borrará la memoria de vídeo y nos quedamos sin imagen :D

davidgutierrez
20/12/2007, 19:48
Eso de formar un equipo de desarrollo, complicado lo veo, por dos motivos, primero porque tengo ya muchos proyectos en marcha y no puedo meterme en otro más, me gustaría terminar antes los que tengo pendientes, y segundo porque si precisamente esos proyectos nunca les dedico tiempo, no puedo comprometerme con nadie a hacer algo que luego no voy a poder dedicarle tiempo ya sea por un motivo u otro.

Bueno, ningún problema. Yo por mi parte seguiré haciendo más cositas que, si bien serán cosas muy simples para otros que estén acostumbrados a hacerlos, a mi me servirán para seguir aprendiendo. Quien sabe, quizás dentro de algún tiempo sí que esté preparado para hacer algo más grande que lo que sería capaz de hacer ahora mismo... y quien sabe, quizás más adelante sí que compartamos algún proyecto, tiempo al tiempo :brindis:



Pues no me lo he planteado porque quería que fuese un ejemplo lo más sencillo posible, aunque eso lo limitase a usuarios de linux. Generalmente sí suelo hacer mis proyectos lo más multiplataforma posible, es algo que me encanta :)

Cuando estaba aprendiendo a hacer el ejemplo este, encontré un código que hacía algo parecido pero para windows, y no había mucha diferencia, salvo en los nombres de funciones y poco más. Ten en cuenta que no uso ningún tipo de comunicación entre hilos ni mutexes ni nada de eso, sólo lanzar un hilo y luego esperar a que termine, lo que es muy fácil de portar a windows.


Es un buen principio, aunque para que sea "usable para proyectos de verdad" creo que haría falta algún tipo de comunicación y sincronización entre procesos. De todas formas, tengo una idea que tal vez pueda solucionar este problema (aunque no sabré cuan difícil sería de implementar hasta que mire tus ejemplos): ¿sería posible crear una API común que dependiendo para qué sistema operativo estés compilando llame a las funciones de Linux o a las de la librería para Windows que comentas?



Oye, esto mismo también lo pensé yo para hacer estas navidades :) Se me ocurren dos maneras...

Bueno, cuantas más alternativas tengamos para hacer una misma cosa mejor, así podemos comparar a ver cuál de ellas es más fácil y/o tiene un rendimiento mayor y elegir la opción que más se adapte a lo que necesitamos. Ya nos informarás de cómo resulta la cosa, espero ansioso noticias de los resultados obtenidos.