我与 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)',而且我不知道我该怎么做