[Python-es] librería para programación y comunicación entre procesos

tny a.porrua en gmail.com
Mie Oct 6 11:45:59 CEST 2010


Saludos pythoneros.

Llevo un tiempo desarrollando una aplicación cliente-servidor tipo p2p
descentralizado, los servidores usan un pool de procesos para las
conexiones.

Para no mezclar y líar el código y la lógica de mi aplicación con el
código y la lógica de cliente-servidor he separado todo el código
cliente-servidor, y estoy desarrollando con ello una librería
cliente-servidor de gran abstracción muy sencilla de usar.

Y otra vez, para no mezclar la lógica de cliente-servidor con la lógica
de multi-proceso, separé todo el código multi-proceso en otra librería.

Si alguién tiene interés en usar (están en continuo desarrollo y
posiblemente sufran modificaciones) o ver alguna librería la subo a
megaupload y pego aquí el enlace, si a alguién le interesa el proyecto y
tiene ganas de ayudar podemos montar algo. 

Funcionando tengo:

- environ: una librería que hace uso de las variables de entorno de
forma totalmente transparente para la aplicación.
Esto es, donde va un entero, ponemos un environ.Int, y la aplicación no
nota la diferencia, pero podemos cambiar el valor desde el proceso padre
(en unix).
Yo la uso para establecer el loglevel de todos los procesos.
Hay una versión environ para  Int, Float, Long y Complex, si hay interés
desarrollaré también str, y list, dict y set serializables.

- Exceptions: no tiene nada que ver con el multiproceso, define una
clase base de excepciones que se pueden lanzar con un mensaje y
cualquier numero de parametros con nombre, para pasar información
arbitraria entre el raise y el except.
define también una función para crear rápidamente nuevas excepciones,
para poder hacer un except fino.
exceptions.makeException('nombre de excepción')

fork: Aún es de bastabte bajo nivel, aún tengo en el servidor mucha
código que debería estar en esta librería.
Define 3 funciones, 
forkPipe que devuelve (pid del hijo, pipe de lectura, pipe de escritura)
al padre y (0, pipe de lectura, pipe de escritura) al hijo
forkSocket que devuelve pid o 0 y un socket af_unix
zombi: Comprueba si hay algún proceso hijo finalizado, lo limpia y
devuelve su pid y su código de salida (sys.exit(..)), si no hay ninguno
hijo finalizado
si no hay ningún proceso finalizado devuelve (0,0)

multilog, un logger a archivo para multiproceso (requiere un servidor de
multilog corriendo)

poll, añade bastante abstracción sobre select.poll
define una clase Poll, cuyos objetos tienen los siguientes métodos
Poll.register(fileno, evento (POLLIN, POLLOUT...), callback, *parametros
de usuario)
poll.unregister(fileno, evento)
poll.enable(fineno, evento, *parametros de usuario)
poll.disable(fileno, evento)
poll.clear()
poll.do([timeout=0])
A está librería de poll tengo pensado añadirle más abstracción hasta
tener un sistema de comunicación entre procesos basado en eventos más
que en mensajes vía pipe o socket.

Tengo pensado trabajar en un sistema de diccionario compartido, tal vez
con la posibilidad de que lance eventos cuando se modifique algún valor.



Más información sobre la lista de distribución Python-es