Domanda

I miei sguardi codice come questo:

... # 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

L'output:

1

OK

Fin qui, tutto bene, ma, la risposta HTTP (ritorno 'fatto'), accade solo dopo il ritardo (time.sleep (2)). Posso dire questo, perché il browser continua a 'carico' per 2 secondi.

Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

Che cosa si sta facendo male è in esecuzione un blocco delle chiamate (time.sleep(2)), mentre ritorto si aspetta di eseguire solo le operazioni di non-blocking. Cose che non aspettano. Perché hai che time.sleep(2) in là, Contorto non può fare altro mentre quella funzione sta dormendo. Così non può inviare i dati al browser, sia.

Nel caso di time.sleep(2), si dovrebbe sostituire quello con un'altra chiamata reactor.callLater. Supponendo che in realtà significava per la chiamata time.sleep(2) essere qualche altra operazione di blocco, come risolvere il problema dipende dal funzionamento. Se si può fare l'operazione in modo non bloccante, farlo. Per molte di queste operazioni (come l'interazione del database) ritorto viene fornito già con le alternative non-blocking. Se la cosa si sta facendo non ha alcuna interfaccia non-blocking e Twisted non avere un'alternativa ad esso, potrebbe essere necessario eseguire il codice in un thread separato (usando per esempio twisted.internet.threads.deferToThread), anche se questo richiede il codice è in realtà filo -safe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top