2011-02-02 5 views
5

Estoy desarrollando una aplicación en red en Twisted, parte de la cual consiste en una interfaz web escrita en Django.Twisted: Crear un ThreadPool y luego daemonizar conduce a bloqueos no informativos

Deseo usar el servidor WSGI de Twisted para alojar la interfaz web, y he escrito un complemento "tap" que funciona para permitirme usar twistd.

Al ejecutar el servidor con el indicador -n (no daemonize) todo funciona bien, pero cuando se elimina este indicador, el servidor no responde a las solicitudes y no hay ningún mensaje registrado (aunque el servidor es Aún corriendo).

Hay un bug on Twisted's Trac que parece describir el problema exactamente, y mi complemento está basado en el code referenced in the ticket.

Desafortunadamente, el problema no se ha solucionado, y se planteó hace casi un año.

He intentado crear una clase ThreadPoolService, que se extiende Service y comienza una determinada ThreadPoolstartService cuando se llama:

class ThreadPoolService(service.Service): 
    def __init__(self, pool): 
     self.pool = pool 

    def startService(self): 
     super(ThreadPoolService, self).startService() 
     self.pool.start() 

    def stopService(self): 
     super(ThreadPoolService, self).stopService() 
     self.pool.stop() 

Sin embargo, no parece torcida ser una llamada al método startService en absoluto. Creo que el problema es que con un complemento de "toque", el ServiceMaker solo puede devolver un servicio que se va a iniciar, y los otros que pertenecen a la misma aplicación no se inician. Obviamente, estoy devolviendo un servicio TCPServer que contiene la raíz WSGI.

En este punto, he golpeado algo así como una pared de ladrillos. ¿Alguien tiene alguna idea de cómo puedo solucionar este problema?

Respuesta

7

Devuelva MultiService desde su ServiceMaker; uno que incluye su ThreadPoolService, así como su servicio de aplicación principal. El API para el montaje de tal cosa es bastante sencillo:

multi = MultiService() 
mine = TCPServer(...) # your existing application service 
threads = ThreadPoolService() 
mine.setServiceParent(multi) 
threads.setServiceParent(multi) 
return multi 

Teniendo en cuenta que ya has encontrado el billete para tratar este tema confuso dentro de trenzado, miro adelante a ver su parche :).

+0

Esto es perfecto. No sé por qué no lo vi en la documentación, pero funciona como un encanto. ¡Gracias! –

Cuestiones relacionadas