Redis和django-socketio

时间:2013-01-25 10:38:58

标签: django redis socket.io gevent gevent-socketio

我与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)',我不知道我怎么能做不同的事情

0 个答案:

没有答案