2016-07-22 12 views
1

1つのPythonモジュールAではいくつかのことをやっています。そのようなことをしている途中で、私は倹約のつながりを作り出しています。問題は、接続が開始された後で、プログラムがネットワークロジックにスタックされてしまうことです。 (すなわち、ブロックする)。私が持っているモジュールAではノンブロッキングサーバーApache Thrift Python

:ネットワークで

stuff = "do some stuff" 
network.ConnectionManager(host, port, ...) 
stuff = "do more stuff" # not getting to this point 

...

ConnectionManager.start_service_handler() 
def start_service_handler(self): 
     handler = ServiceHandler(self) 
     processor = Service.Processor(handler) 
     transport = TSocket.TServerSocket(port=self.port) 
     tfactory = TTransport.TBufferedTransportFactory() 
     pfactory = TBinaryProtocol.TBinaryProtocolFactory() 
     # server = TServer.TThreadedServer(processor, transport, tfactory, pfactory) 
     server = TNonblockingServer(processor, transport, tfactory, pfactory) 
     logger().info('starting server...') 
     server.serve() 

私はこれを試して、まだモジュールAのコードは、すぐに接続コードが起動する続行されません。

私はTNonblockingServerがこのトリックを行うと思っていましたが、残念ながらそうはしませんでした。

答えて

2

server.serve()のコードブロックは、設計上、Thriftでサポートされているすべてのターゲット言語にわたって存在します。通常の使用の場合には、このようなサーバー(擬似コード)を実行することです:

init server 
setup thrift protocol/tramsport stack 
server.serve() 
shutdown code 

「ノンブロッキング」は、むしろ実際のクライアントのコールを取ったコードに、server.serve()コールを指すものではありません。 TSimpleServerを使用すると、サーバーは一度に1つのコールしか処理できません。対照的に、TNonblockingServerdesigned to accept a number of connections in parallelです。

結論:Thriftサーバーを実行し、他の作業を並行して実行する場合や、プログラムの実行中にオンザフライでサーバーを起動および停止する必要がある場合は、そのために別のスレッドが必要です。

関連する問題