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サーバー実装
あなたがしようとすると別のスレッドで 'self.process'メソッドを実行することができます。それがCPUを大量に消費するタスクであれば、それを別のスレッドで実行することはできません。ネットワーク接続のタスクの場合は、そのタスクの非同期ライブラリを探したり、自分で作成したりできます。 – xyres
編集[いくつかの言語は最後のコメントで混乱していました]:スレッドの数を['max_workers'](https://docs.python.org/3.5/library/concurrent.futures.html#concurrent)で制限することができます。 futures.ThreadPoolExecutor)の引数です。したがって、一度に限られた数の要求だけが処理され、残りはキューに入れられます。 – xyres
私は 'ThreadPoolExecutor'を思いついたばかりです。私はこれがこれのための良いlibだと思う。 –