0

設定:

  • Tornado HTTP/WebSocket サーバー。WebSocketHandler はクライアントからのメッセージに反応します (例: ジョブキューに入れます)
  • さまざまなコンポーネントにジョブを送信する Beanstalk ジョブ キュー
  • 豆の木を介して通信する他のコンポーネントもありますが、それらは私の問題とは関係ありません。

問題:

  • WebSocketHandler はジョブに反応する必要がありますが、Beanstalk をリッスンしている場合はブロックされます。ジョブは、たとえば「データ xy をクライアント xyz に送信する」などです。

これはどうすればうまく解決できますか?私の最初のアプローチは、ピクルされた WebSocketHandler のリストを含む別のスレッドで jobqueue-listener を実行することでした。すべて redis-db に保存する必要があります。WebsocketHandler は pickle 化できないため (このアプローチは非常に醜いようです)、別の解決策を探しています。

何か案は?

4

1 に答える 1

1

WebSocketHandler インスタンスをピクルしようとする代わりに、それらをクラス レベル (またはグローバル) 辞書に格納できます。

class MyHandler(WebSocketHandler):
    connections = {}

    def __init__(self, *args, **kwargs):
        self.key = str(self)
        self.connections[self.key] = self

次に、ジョブとともに self.key を Beanstalk に渡します。ジョブが戻ってきたら、キーを使用して出力を送信する接続を検索し、それに書き込みます。のようなもの(疑似コード...)

 def beanstalk_listener():
     for response in beanstalk.listen():
         MyHandler.connections[response.data[:10]].write_message(response[10:])

websockethandler 接続を redis で永続化しようとしても、何の価値もないと思います。それらは本質的に一時的なものです。竜巻プロセスが再起動/停止した場合、それらは役に立ちません。あなたがしようとしているのが、どのユーザーがどのジョブの出力を待っているかを記録することである場合は、それを個別に追跡する必要があります。

于 2013-04-17T07:24:22.447 に答える