2010-01-27 15 views
5

¿Es posible integrar asyncore con dbus a través del mismo main loop?Python asyncore & dbus

Por lo general, la integración de Enlace con el Bus se realiza a través glib bucle principal: ¿es posible tener ya sea asyncore integrar este bucle principal o tienen un uso dbus asyncore 's?

+0

¿Por qué usarías asyncore cuando tienes glib? glib parece mucho más capaz ... –

Respuesta

7

asyncore sucks. glib ya proporciona cosas asincrónicas, así que solo usa el mainloop de glib para hacer de todo.

0

Aunque haya obtenido una respuesta que es perfectamente razonable, hay otro enfoque: no necesita usar el bucle de asyncore per se. Simplemente llame a asyncore.loop con un tiempo de espera cero y un recuento de 1, lo que detiene su iteración (y por lo tanto hace que el nombre de la función sea completamente erróneo) y sondea los sockets solo una vez. Llámalo tan a menudo como lo necesites.

No sé nada sobre la compatibilidad asincrónica de glib, pero si requiere subprocesos puede obtener un mejor rendimiento si utiliza asyncore de esta manera ya que usará seleccionar o sondear y no necesitará engendrar hilos adicionales.

+1

gracias por tus pensamientos - Me he decidido por Twisted para este proyecto. – jldupont

1

me escribió un trivial GSource contenedor para uno de my own projects llamada AsyncoreGSource

Sólo attach a una adecuada MainContext:

source = AsyncoreGSource([socket_map]) 
source.attach([main_context]) 

Naturalmente, los valores por defecto son asyncore.socket_map y la default MainContext respectivamente.

También puedes probar monkey-patching asyncore.socket_map, que hubiera sido mi solución si no hubiera pinchado a través del GLib python bindings source code for GSource.

+0

Tenga en cuenta que desde entonces he tenido algunos problemas de rendimiento con esto, y tengo una versión que se integra completamente con la interfaz de sondeo de GLib en Linux (pero no en Windows). Actualizaré esta respuesta cuando las cosas se estabilicen. –

Cuestiones relacionadas