2012-08-03 14 views
6

Perdón por el título vago, pero no pude encontrar algo mejor.Reactor retorcido obtener estado actual

¿Hay alguna forma de obtener retorcido el estado actual del reactor? Por estado que quiero decir:

  • oyentes en los puertos
  • protocolos conectados
  • Deferreds que están esperando para ser disparado
  • LoopingCalls que ejecutan
  • Temas que son "inactivo"
  • y otras cosas "activas" ...

Básicamente Estoy tratando de averiguar si el reactor está sentado sin hacer nada. La pregunta en sí es más amplia de lo que realmente necesito hacer, en aras de la plenitud de stackoverflow.

Ahora, mi situación actual es la siguiente:

estoy usando algún otro script que escucha en muchos puertos "dinámicas" que son seleccionados por el guión de esta persona, por lo que no se puede simplemente usar mi script para haga algo como listenTCP o TCP4ServerEndpoint y verifique el estado del mismo. Esto es algo similar al FTP que no es PASV donde cada puerto de escucha se descarta después de cada uso. El otro problema es que mi propio pequeño programa también se ejecuta en el mismo proceso, y lo uso como argumento para iniciar su programa. Básicamente es una interfaz para su programa. Cuando todas sus cosas están hechas Y mis cosas están hechas también, quiero apagar el reactor. Por lo tanto, estoy tratando de averiguar cuándo puedo detener el reactor. Mi condición exacta a la parada es la siguiente:

  • Sólo escucha en el puerto 1, y ningún otro.
  • No hay deffered ni bucle Llamadas que van a disparar.

Realicé búsquedas pero solo encontré cosas como "if reactor.running" o Stop twisted reactor on a condition, que debe realizar un seguimiento mediante el uso de marcas. Preferiría no tocar su código. Si es algo que podría contribuir a retorcerse, preferiría hacer eso. Pero si ya existe una alternativa, preferiría no volver a inventar la rueda.

¿Tiene que cambiar su script para que notifique a mi script de estas condiciones?

Respuesta

2

El código que está llamando debe refactorizarse para devolver un Deferred de algo; probablemente una implementación de IService.stopService que lo detenga. La razón para hacerlo de esta manera es que no siempre se sabe lo que estará sentado en el reactor, incluso cuando las cosas están aparentemente "inactivas". Por ejemplo, ¿sabías que Twisted mantiene un descriptor de archivo (el "waker") para la comunicación desde los hilos? ¿Que el servidor HTTP mantiene un callLater pendiente en todo momento para escribir la próxima entrada del registro de acceso? Otros bits de infraestructura en bibliotecas de terceros pueden dejar un estado arbitrario diferente en el reactor que realmente no es de su incumbencia.

Sin embargo, el reactor tiene un poco de apoyo de introspección. Por ejemplo, hay IReactorTime.getDelayedCalls, IReactorFDSet.getReaders/getWriters y IReactorThreads.getThreadPool.Sin embargo, no hay IReactorWin32Events.getAllEvents, por lo que este no es un conjunto de cosas completamente portátil. Definitivamente apreciaríamos que quisieras contribuir con más implementaciones de introspección de reactores, para depuración y diagnóstico.

+0

Gracias Glyph por la respuesta. – SleepyMan

+0

Gracias @Glyph por la respuesta. Presione Enter por hábito. Realmente no quería meterme con su código porque mi filosofía está en conflicto con la suya. Pero, ¿cómo iba a integrar mi código con el suyo con IService? Diferentes procesos de comunicación a través de sockets? Bueno, de cualquier forma, le notificaré que su script necesita cambios. Por el momento, intentaré aprender un poco más sobre las partes internas de Twisted antes de contribuir (creo que es bueno aprender sobre la filosofía de Twisted, ¿verdad?). ¿La única forma de aprender estas cosas es leer la fuente o está documentada en alguna parte? – SleepyMan