我与django-socketio建立了聊天,我正在尝试使用redis。
我有一个非常简单的event.py:
@events.on_message(channel='^channel-')
def messages(request, socket, context, message):
socket.send_and_broadcast_channel(message)
聊天效果很好。
现在我正在尝试实现redis:
@events.on_message(channel='^channel-')
def messages(request, socket, context, message):
r = redis.StrictRedis()
r = r.pubsub()
r.subscribe('chat')
s = redis.Redis()
s.publish('chat', message)
for m in r.listen():
data = m['data']
print data
消息发布在redis频道上,但是一旦我调用.listen(),就不再有效了。看起来.listen()正在“阻止”一切。我甚至无法使用ctr + C来逃避服务器
关于如何解决这个问题的任何想法?谢谢!
编辑:
以下是我现在所拥有的:
def listener(self):
r = redis.StrictRedis()
r = r.pubsub()
r.subscribe('chat')
for m in r.listen():
message = m['data']
socket.send_and_broadcast_channel(message)
@events.on_message()
def messages(request, socket, context, message):
r = redis.Redis()
r.publish('chat', message)
仍然无效。
为了使redis与gevent一起使用(由django-socketio使用),我们必须在用户订阅时启动Greenlet。 所以我们需要添加类似的东西:
def on_subscribe(self, *args, **kwargs):
self.spawn(self.listener)
但鉴于我们必须使用一个事件,我不知道如何用django-socketio做到这一点
@event.on_connect()
def connect(request, socket, context)
但我无法通过“自我”的论证。所以我不能使用'self.spawn(self.listener)',我不知道我怎么能做不同的事情