2013-04-17 87 views
0

设置:非阻塞WebSocketHandler而从队列中接收作业

  • 龙卷风HTTP/WebSocket伺服器。 WebSocketHandler从客户端的消息反应(例如把它们放在作业队列)
  • 一个豆茎工作队列这将作业发送到不同的组件
  • 其他一些组件通信的魔豆,但这些都是无关我的问题。

问题:

  • WebSocketHandler应该对就业的反应,但如果他是在魔豆听,它的阻塞。工作可能是'发送数据xy到客户端xyz'

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

任何想法?

回答

1

而不是试图腌制你的WebSocketHandler实例,你可以将它们存储在类级别(或全球)字典中。

class MyHandler(WebSocketHandler): 
    connections = {} 

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

然后,你会通过self.key与作业豆茎一起,当你得到一份工作回来,你仰望输出发送其连接到配钥匙,然后写它。类似于(伪代码...)

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

我不认为在尝试在redis中保留websockethandler连接时没有任何价值。它们本质上是短暂的。如果你的龙卷风过程重新启动/死亡,他们没有用。如果你想要做的是记录哪个用户正在等待哪个工作的输出,那么你需要分开跟踪。

+0

感谢您的回答,它按照我的预期工作:-) – Beastcraft