0

设置:

  • Tornado HTTP/WebSocket 服务器。WebSocketHandler 对来自客户端的消息做出反应(例如,将它们放入作业队列中)
  • 将作业发送到不同组件的 beanstalk 作业队列
  • 其他一些通过 beanstalk 进行通信的组件,但这些与我的问题无关。

问题:

  • WebSocketHandler 应该对作业做出反应,但如果他正在监听 beanstalk,它会阻塞。作业可以是例如“将数据 xy 发送到客户端 xyz”

如何很好地解决这个问题?我的第一种方法是在一个单独的线程中运行一个作业队列侦听器,其中包含一个腌制 WebSocketHandler 的列表。所有内容都应存储在 redis-db 中。由于 WebsocketHandler 不能被腌制(而且这种方法似乎很丑陋),我正在寻找另一种解决方案。

有任何想法吗?

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 回答