質問

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

... # 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応答(return 'done')は、遅延後にのみ発生します(time.sleep(2))。ブラウザは2秒間「ロード」を保持しているため、これを伝えることができます。

私は何が間違っているのですか?

役に立ちましたか?

解決

あなたが間違っているのは、ブロッキングコールを実行することです(time.sleep(2))、Twistedは、非ブロッキング操作のみを実行することを期待しています。待たないもの。あなたがそれを持っているからです time.sleep(2) そこには、その機能が眠っている間、Twistedは他に何もできません。そのため、ブラウザにデータを送信することもできません。

の場合 time.sleep(2), 、それを別のものに置き換えます reactor.callLater 電話。あなたが実際にのために意図されていると仮定します time.sleep(2) 他のブロッキング操作であるように呼びかけ、それを修正する方法は操作によって異なります。ノンブロッキングの方法で操作を行うことができる場合は、それを行います。多くのそのような操作(データベースインタラクションなど)Twistedには、非ブロッキングの代替品が既に付属しています。あなたがしていることに非ブロッキングインターフェイスがなく、ツイストがそれに代わるものがない場合、あなたは別のスレッドでコードを実行する必要があるかもしれません(たとえば、使用して twisted.internet.threads.deferToThread)、それはあなたのコードが実際にはスレッドセーフである必要がありますが。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top