Question

Mon apparence de code comme ceci:

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

1

ok

Jusqu'à présent, si bon, mais la réponse HTTP (retour 'fait'), ne se produit après le délai (time.sleep (2)). Je peux dire cela, parce que le navigateur conserve pendant 2 secondes « chargement ».

Qu'est-ce que je fais mal?

Était-ce utile?

La solution

Qu'est-ce que vous faites mal est en cours d'exécution un appel blocage (time.sleep(2)), tandis que Twisted vous attend à effectuer que des opérations non-bloquant. Les choses qui n'attendez pas. Parce que vous avez ce time.sleep(2) là-dedans, Twisted ne peut rien faire d'autre pendant cette fonction dort. Donc, il ne peut pas envoyer de données au navigateur, que ce soit.

Dans le cas de time.sleep(2), vous ne le remplacer par un autre appel reactor.callLater. En supposant que vous avez réellement voulu dire pour l'appel time.sleep(2) être une autre opération de blocage, comment corriger cela dépend de l'opération. Si vous pouvez faire l'opération d'une manière non bloquante, faire. Pour beaucoup de ces opérations (comme l'interaction de base de données) Twisted vient déjà avec des alternatives non-blocage. Si la chose que vous faites n'a pas d'interface non-blocage et Twisted n'a pas une solution de rechange, vous devrez peut-être exécuter le code dans un thread séparé (en utilisant par exemple twisted.internet.threads.deferToThread), bien que cela nécessite votre code est en fait fil -safe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top