WSGIアプリケーションは独自のスレッド(またはプロセス)で実行されます。 TwistedのWSGIコンテナで実行している場合、それは原子炉が動作しているスレッドとは異なるスレッドです。TwistedのAPIのほとんどはスレッドセーフではありません。リアスティックスレッドでのみ呼び出すことができます。
だから、スレッドセーフであるとreactor.callFromThread
を使用しているWSGIアプリケーションからツイストAPIを呼び出すための基本的な方法は、関数は原子炉のスレッドで呼び出されます。しかし
...
reactor.callFromThread(pbRemote.callRemote, "someMethod", some, args)
、これをあなたはおそらくあなたが望む結果を破棄します。あまりにも、それをしかし、結果を保存しreactor.callFromThread
の上にAPIを構築するためにシンプルだし、ツイストのそれの実装があります:
from twisted.internet.threads import blockingCallFromThread
...
result = blockingCallFromThread(reactor, pbRemote.callRemote, "someMethod", some, args)
callRemote
火災によって返された繰延まで、この呼び出しはブロックされますし、それがしますそのDeferredの結果を返します。
電話をかけたい場合は、他の仕事をしてから、電話が終了するのを待ってから少し創造しなければなりません。
resultHolder = blockingCallFromThread(
reactor, lambda: [pbRemote.callRemote("someMethod", some, args)])
そして、あなたはあなたがする必要がある他のどのような作業を行うことができます:あなたが電話をかけると、それが返されますが、それをブロックしていないDeferred
実際に取得する必要があります。あなたはPB呼び出しの結果を待つ準備ができたらと:
result = blockingCallFromThread(reactor, lambda: resultHolder[0])
これは、シングルスレッドのシナリオでツイストを使用するよりも、すべてではなく、より厄介であるので、確かにツイストウェブのネイティブを使用する方が簡単な場合がありWSGIアプリケーションを構築するのではなく、 WSGIの主な目標の1つは、Twisted、Apacheなど、さまざまなサーバー間で移植可能なアプリケーションを開発できるようにすることです。WSGIアプリケーションで実際にTwisted APIを使用している場合は、移植性がまったくありません。
Twisted webを使うのがもっと簡単でない限り、私はFlaskを使ってwebappを書くつもりです。 – Blubber
次に、ブローカーの作成、Twistedを使用したXML-RPCの受け入れ、サーバーへの呼び出しについて説明します。 Flask - > XML-RPC Broker - >あなたのサーバー? –