设置:
- Tornado HTTP/WebSocket服务器。WebSocketHandler对来自客户端的消息作出反应(例如,将它们放入作业队列(
- 将作业发送到不同组件的豆茎作业队列
- 其他一些组件通过豆茎进行通信,但这些与我的问题无关
问题:
- WebSocketHandler应该对作业做出反应,但如果他在监听beanstall,它就会被阻塞。作业可以是例如"将数据xy发送到客户端xyz">
如何才能很好地解决这个问题?我的第一种方法是在一个单独的线程中运行一个jobqueue侦听器,该线程包含一个pickle WebSocketHandler列表。所有这些都应该存储在redis数据库中。由于WebsocketHandler不能被pickle(而且这种方法看起来很难看(,我正在寻找另一种解决方案。
有什么想法吗?
您可以将WebSocketHandler实例存储在类级(或仅全局(字典中,而不是试图pickle它们。
class MyHandler(WebSocketHandler):
connections = {}
def __init__(self, *args, **kwargs):
self.key = str(self)
self.connections[self.key] = self
然后,你会将self.key和作业一起传递给beanstall,当你得到一个作业时,你会用密钥查找要将输出发送到哪个连接,然后写入它。类似于(伪代码…(
def beanstalk_listener():
for response in beanstalk.listen():
MyHandler.connections[response.data[:10]].write_message(response[10:])
我认为在redis中保持你的websocketthandler连接没有任何价值。它们本质上是短暂的。如果你的龙卷风过程重新开始/死亡,它们就没有用了。如果你想做的是记录哪个用户正在等待哪个作业的输出,那么你需要单独跟踪。