2

私のコードは次のようになります。

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

出力:

1

わかった

ここまでは順調ですが、HTTP 応答 ('done' を返す) は遅延 (time.sleep(2)) 後にのみ発生します。ブラウザが 2 秒間「読み込み」を続けるため、これがわかります。

私は何を間違っていますか?

4

1 に答える 1

4

あなたが間違っているのはブロッキング呼び出し ( time.sleep(2)) を実行していることですが、Twisted は非ブロッキング操作のみを実行することを期待しています。待たないもの。そこにそれがtime.sleep(2)あるので、その関数がスリープしている間、Twisted は他に何もできません。したがって、ブラウザにデータを送信することもできません。

の場合は、それを別の呼び出しtime.sleep(2)に置き換えます。reactor.callLater実際にtime.sleep(2)呼び出しが他のブロッキング操作であると仮定すると、それを修正する方法は操作によって異なります。ブロックしない方法で操作を実行できる場合は、それを実行してください。そのような多くの操作 (データベースのやり取りなど) に対して、Twisted にはすでにノンブロッキングの代替手段が用意されています。あなたがしていることにノンブロッキングインターフェースがなく、Twisted に代替手段がない場合は、別のスレッドでコードを実行する必要があるかもしれません (たとえばtwisted.internet.threads.deferToThread、 を使用)。安全。

于 2012-02-16T12:31:52.067 に答える