2017-11-19 15 views
-1
class Client(tornado.websocket.WebSocketHandler): 
    def open(self): 
     print "Connection is opened" 

    def on_message(self, message): 
     self.Process(message) 

    def on_close(self): 
     print "socket closed" 

上記のコードはpython/tornadoであると仮定します。 Clientのインスタンスは、新しいWebSocketクライアントがサーバーに接続するときに作成されます。問題は、self.process(message)が処理中であり、ハンドラ全体がブロックされている(接続を受け付けず、メッセージを受信しない)ということです。self.process(message)が処理中である限りです。この障害を克服するための解決策はありますか?TornadoノンブロッキングWebSocketサーバー実装

+0

あなたがしようとすると別のスレッドで 'self.process'メソッドを実行することができます。それがCPUを大量に消費するタスクであれば、それを別のスレッドで実行することはできません。ネットワーク接続のタスクの場合は、そのタスクの非同期ライブラリを探したり、自分で作成したりできます。 – xyres

+0

編集[いくつかの言語は最後のコメントで混乱していました]:スレッドの数を['max_workers'](https://docs.python.org/3.5/library/concurrent.futures.html#concurrent)で制限することができます。 futures.ThreadPoolExecutor)の引数です。したがって、一度に限られた数の要求だけが処理され、残りはキューに入れられます。 – xyres

+0

私は 'ThreadPoolExecutor'を思いついたばかりです。私はこれがこれのための良いlibだと思う。 –

答えて

0

は、ここではThreadPoolExecutorを始めるための基本的なコードです:

import concurrent.futures 

# create a `ThreadPoolExecutor` instance 
executor = concurrent.futures.ThreadPoolExecutor(max_workers=8) 


class Client(tornado.websocket.WebSocketHandler): 

    def on_message(self, message): 
     # ask `executor` to run `self.process` in a thread 
     executor.submit(self.process, message) 

    def process(self, message): 
     # do something blocking ... 
     return processed_message 

あなたがそれを処理した後on_message内のメッセージにアクセスしたい場合、あなたはその後、gen.coroutineし、それを飾るためにしましたyieldexecutor.submit(...)

from tornado import gen 

class Client(tornado.websocket.WebSocketHandler): 

    # decorate on_message with gen.coroutine 
    @gen.coroutine 
    def on_message(self, message): 
     # now use the yield keyword 
     processed_message = yield executor.submit(self.process, message) 
     # do something with processed_message 

    def process(self, message): 
     # do something blocking ... 
     return processed_message 
+0

8人の労働者がどれだけ長く生存していますか?最初のreqが処理されたと仮定すると、プールのスレッドは終了しますか?まだ生きている? –

+0

@MehrdadDadvandプールの労働者は常に生きています。これは、スレッドの開始と停止にかかる時間を短縮するために重要です。 – xyres

+0

それは素晴らしいです。たくさんありがとう。それは助けた –

関連する問題