0

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

4

0 回答 0