Pregunta

Mi código se ve así:

... # class Site(Resource)
def render_POST(self,request)
   otherclass.doAssync(request.args)
   print '1'
   return "done" #that returns the HTTP response, always the same.

...

def doAssync(self,msg):
    d = defer.Deferred()
    reactor.callLater(0,self.doStuff,d,msg)
    d.addCallback(self.sucess)

def doStuff(self,d,msg):
    # do some stuff
    time.sleep(2)  #just for example
    d.callback('ok')

def sucess(msg):
    print msg

La salida:

1

OK

Hasta ahora, todo bien, pero, la respuesta HTTP (retorno 'hecho'), solo ocurre después del retraso (tiempo.sleep (2)). Puedo decir esto, porque el navegador sigue 'cargando' durante 2 segundos.

¿Qué estoy haciendo mal?

¿Fue útil?

Solución

Lo que estás haciendo mal es ejecutar una llamada de bloqueo (time.sleep(2)), mientras que Twisted espera que solo realice operaciones no de bloqueo. Cosas que no esperan. Porque tienes eso time.sleep(2) Allí, Twisted no puede hacer otra cosa mientras esa función está durmiendo. Por lo tanto, tampoco puede enviar ningún dato al navegador.

En el caso de time.sleep(2), reemplazarías eso con otro reactor.callLater llamar. Asumiendo que realmente significaba para el time.sleep(2) Llame para ser otra operación de bloqueo, cómo solucionarla depende de la operación. Si puede hacer la operación de una manera no bloqueada, haz eso. Para muchas operaciones de este tipo (como la interacción de la base de datos), Twisted ya viene con alternativas sin bloqueo. Si lo que está haciendo no tiene una interfaz sin bloqueo y Twisted no tiene una alternativa, es posible que deba ejecutar el código en un hilo separado (usando por ejemplo twisted.internet.threads.deferToThread), aunque eso requiere que su código sea realmente seguro de hilo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top