ツイストノンブロッキングメソッド - どうやって?
-
26-10-2019 - |
質問
私のコードは次のようになります:
... # 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
)、それはあなたのコードが実際にはスレッドセーフである必要がありますが。
所属していません StackOverflow