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」を渡すことはできません。だから私は「self.spawn(self.listener)」を使うことができず、どうすれば違うやり方ができるのかわからない

4

0 に答える 0