python multithreading events twisted reactor

python - Múltiples reactores(bucles principales) en una aplicación mediante subprocesamiento(o medios alternativos)



multithreading events (2)

Tengo una idea para una aplicación en la que me gustaría trabajar para aprender un poco más sobre Twisted y WebSockets . Estaba pensando en integrar un Bot IRC escrito previamente en una aplicación web. Por lo que puedo ver, necesitaría tres reactores para que funcione:

  • Reactor primario : servidor web (HTTP). Esta sería su aplicación twisted.web promedio. Cuando accede, puede enviar un servidor / canal IRC a la conexión. El servidor web luego hablaría con un reactor diferente en un hilo diferente, que es ...
  • Reactor secundario : IRC Bot. Este sería un bot IRC que se ejecuta a través del protocolo de cliente Twisted IRC. Se uniría a un canal, y cada vez que se dijera algo, tomaría esos datos y los enviaría a otro reactor, en otro hilo, que es ...
  • Reactor terciario : WebSocket Server (WS): dado que WebSockets no usa el protocolo HTTP normal, necesita su propio servidor (o eso parece, mirando ejemplos como this . Cuando el bot IRC recibe un mensaje, le dice al WebSocket Servidor para enviar ese mensaje a los clientes conectados.

En mi mente, esto tiene sentido. Parece que sería posible. ¿Alguien tiene algún ejemplo de reactores múltiples que se ejecuten en subprocesos separados, o es algo que imaginé que no se puede hacer en la encarnación actual de Twisted?

¿Hay algún cambio en la arquitectura que pueda (o deba) hacerse para minimizar el conteo del reactor, etc.?

Gracias por cualquier ayuda.


No, no creo que necesites múltiples reactores.

Lo que necesitas, es una aplicación multiprotocolo multiservicio. Aquí es donde Twisted realmente brilla.

Por lo tanto, su aplicación debe iniciar un servicio web, un servicio IRC Bot y un servidor WebSocket.

Utilice el marco de servicios de aplicaciones torcido, especialmente al iniciar un servicio múltiple

Compruebe la implementación del bot IRC y la compatibilidad con el protocolo IRC torcido:

y para websocket y retorcido


Por suerte para usted, es fácil reducir el número de reactores, específicamente, a 1:

Solo puedes tener un solo reactor, en un solo hilo, en cualquier proceso Twisted dado. Si intentas tener más, nada funcionará.

El objetivo principal de un reactor, en realidad, es facilitar tener múltiples fuentes de eventos combinados en un solo hilo. Si desea escuchar en 3 puertos diferentes con 3 protocolos diferentes, su aplicación podría tener este aspecto:

from twisted.internet import reactor reactor.listenTCP(4321, FirstProtocolFactory()) reactor.listenTCP(5432, SecondProtocolFactory()) reactor.listenTCP(6543, ThirdProtocolFactory()) reactor.run()

Por supuesto, es posible que no esté llamando a listenTCP directamente, ya que probablemente quiera usar Service objetos del Service desde twisted.application.internet si está usando twistd , ya sea a través de un archivo .tac o un complemento twistd . Y no necesitará llamar a reactor.run() usted mismo, si twistd está haciendo por usted. Mi punto aquí es que, por cualquier medio, carga el reactor con todos los eventos a los que espera que reaccione (servidores de escucha, conexiones de clientes, eventos cronometrados) y reaccionará a cada uno de ellos a medida que ocurra. (De ahí, "reactor".)

Para los valores específicos de lo que deben ser FirstProtocolFactory , SecondProtocolFactory y ThirdProtocolFactory , consulte los enlaces en la respuesta de pyfunc.