从队列接收作业时非阻塞WebSocketHandler

时间:2013-04-17 06:52:45

标签: python tornado beanstalkc

设定:

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

问题:

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

怎样才能很好地解决这个问题? 我的第一种方法是在一个单独的线程中运行一个jobqueue-listener,它包含一个pickle WebSocketHandler列表。所有应该存储在redis-db中。由于WebsocketHandler无法被腌制(这种方法看起来非常难看)我正在寻找另一种解决方案。

有什么想法吗?

1 个答案:

答案 0 :(得分: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:])

我认为尝试在redis中保持websockethandler连接没有任何价值。它们本质上是短暂的。如果您的龙卷风进程重新启动/死亡,则无用。如果您要做的是记录哪个用户正在等待哪个作业的输出,那么您需要单独跟踪它。