2017-07-21 6 views
0

私はPythonで、この闊歩サーバAutobahn Twisted websocketサーバーとSwaggerサーバーは、Pythonでマルチスレッド化されていますか?

app = connexion.App(__name__, specification_dir='./swagger/') 
app.app.json_encoder = JSONEncoder 
app.add_api('swagger.yaml', arguments={'title': ''}) 

app.run(port=8080) 

と、このWebSocketのサーバー2つの異なるスレッドで

from autobahn.twisted.websocket import WebSocketServerProtocol 
import sys 

from twisted.python import log 
from twisted.internet import reactor 
log.startLogging(sys.stdout) 

from autobahn.twisted.websocket import WebSocketServerFactory 
factory = WebSocketServerFactory() 
factory.protocol = MyServerProtocol 

reactor.listenTCP(9000, factory) 
reactor.run() 

を実行できますか?最終的に、idがswagger APIに投稿されたとき、私はこのidを私のwebsocketサーバーに転送し、それから私のwebsocketクライアントへの既存の一致接続を介して送信したいと思います。だから私は2つのスレッドでこれらの2つを実行すると、おそらく私はこのidを変数として共有できると思った。

+0

SwaggerまたはTwisted websocketで何かがスレッドを積極的に防御しない限り、両方がサービスのバックグラウンドで実行されている限り、動作しない理由はありません。しかし、異なるスコープを考えると、IPCの形式を使用してこれらの2つの間でデータを交換することによって、懸念の分離を行い、両方を個別のインスタンスとして実行する方が良い考えがあります。 [プロセス間通信とネットワーク](https://docs.python.org/3/library/ipc.html)にリストされているいくつかの組み込み方法があり、それを実行するにはメトリックトンの方法があります外部リソース。 – zwer

答えて

0

非メインスレッドでTwisted reactorを実行する場合、シグナルハンドリングを無効にする必要があります(Pythonはメインスレッドでのみシグナルハンドラを許可するため)。これはいくつかの機能を無効にしますが、もしあなたがその機能を使用していないなら、これはうまくいくはずです。

ただ、原子炉をこのように起動します。

reactor.run(installSignalHandlers=False) 

これは、あなたが(すべて同じスレッドで、そのthreadsafey問題を最小化または排除する必要がある)非メインスレッドであなたのツイストコードを実行できるようになります。そうすれば、スワッガーコードをメインスレッドで実行することができます。スワッガーコードは、正常に動作するはずです(これは通常通りです)。

また、Swaggerコードをメイン以外のスレッドに、Twistedをメインスレッドに配置することもできます。非メインスレッドでSwaggerコードを実行できるようにするために必要なステップがあるかどうかはわかりません。

スレッド間でデータの受け渡しを開始するときには、変数が1つだけ書き込まれ、もう一方が読み取られる変数だけが必要なわけではありません。これは、スレッドセーフでないコードを作成するための大きな一歩です。代わりに、スレッド間のメッセージングに1つまたは複数のTwisted APIを使用します。たとえば、reactor.callFromThreadはスレッドセーフです(スレッドから安全に呼び出すことができます)。SwaggerスレッドからTwisted reactorスレッドにメッセージを送信するために使用できます。ような何か:それはちょうどから、かのようですので、あなたがスレッドの安全性の問題を持っていない自信を持って、

reactor.callFromThread(process_received_id, id) 

process_received_id(id)は「まもなく」ツイスト原子炉のスレッドで実行され、あなたがやりたいことができます視点がprocess_received_idの場合は、シングルスレッドアプリケーションです。

関連する問題