2010-08-06 6 views
8

Por ejemplo, si una aplicación hace from twisted.internet import reactor, y otra aplicación hace lo mismo, ¿son los mismos reactors lo mismo?¿Es twisted.internet.reactor global?

Pregunto porque Deluge, una aplicación que utiliza retorcida, parece que usa el reactor para conectar su interfaz de usuario (gtk) con el resto de la aplicación que se maneja por torsión (estoy tratando de entender la fuente). Por ejemplo, cuando la IU está cerrada, simplemente llama al reactor.stop().

¿Es eso todo lo que hay que hacer? Simplemente parece una especie de magia para mí. ¿Qué pasa si quiero ejecutar otra aplicación que utiliza twisted?

+0

¿A qué te refieres con 'aplicación'? ¿Te refieres a procesos de Python separados o a múltiples cosas que se ejecutan en un solo proceso? –

Respuesta

13

Sí, cada módulo en Python es siempre global, o mejor dicho, un singleton: cuando lo hace from twisted.internet import reactor, el mecanismo de importación de Python primero comprueba sys.modules['twisted.internet.reactor'] y, si existe, devuelve dicho valor; solo si no existe (es decir, la primera vez que se importa un módulo) es el módulo realmente cargado por primera vez (y guardado en una entrada en sys.modules para posibles importaciones futuras).

No hay nada especialmente mágico en el patrón de diseño de Singleton, aunque a veces puede resultar limitante cuando se necesitan desesperadamente más de una de esas cosas para las que la arquitectura ha decretado que "solo puede haber una". Trenzado de docs reconocen que:

nuevo código de aplicación debe preferir pase y aceptar el reactor como un parámetro donde más se necesita, en lugar de depender de su capacidad para importar este módulo para obtener una referencia. Este simplifica las pruebas unitarias y puede hacer que sea más fácil admitir un día múltiples reactores (como una mejora de rendimiento ), aunque actualmente no es posible.

La mejor manera para que sea posible, si es crucial para su aplicación, es contribuir al proyecto trenzado, ya sea de trabajo (que codifica los sutiles mecanismos necesarios para dar soporte a múltiples reactores, es decir, bucles de eventos múltiples, dentro de una sola aplicación) o fondos (el dinero permitirá mantener a alguien con un estipendio para realizar este trabajo).

De lo contrario, utilice procesos separados (por ejemplo, con el módulo multiprocessing de la biblioteca estándar) con no más de un reactor cada uno.