Каналы Django перестают работать с ошибкой self.receive_lock.locked - PullRequest
0 голосов
/ 29 октября 2018

У меня проблема с использованием каналов Django для создания системы уведомлений. Работает нормально на местном. В производственной среде (в Webfaction) он будет работать нормально в течение нескольких минут, а затем перестанет работать со следующим сообщением об ошибке:

ERROR - server - Exception inside application: 
  File "/home/client/.virtualenvs/project/lib/python3.6/site-packages/channels/sessions.py", line 175, in __call__
    return await self.inner(receive, self.send)
  File "/home/client/.virtualenvs/project/lib/python3.6/site-packages/channels/middleware.py", line 41, in coroutine_call
await inner_instance(receive, send)
  File "/home/client/.virtualenvs/project/lib/python3.6/site-packages/channels/consumer.py", line 54, in __call__
await await_many_dispatch([receive, self.channel_receive], self.dispatch)
  File "/home/client/.virtualenvs/project/lib/python3.6/site-packages/channels/utils.py", line 57, in await_many_dispatch
await task
  File "/home/client/.virtualenvs/project/lib/python3.6/site-packages/channels_redis/core.py", line 400, in receive
assert not self.receive_lock.locked()

Я использую:

  • aioredis == 1.1.0
  • asgiref = 2.3.2
  • каналы == 2.1.3
  • Каналы-Redis == 2.3.0
  • Джанго == 2.1.2
  • Redis 4.0.11
  • Python 3.6.6

Все это использует сервер разработки django.

Мой потребитель выглядит так:

class NotificationConsumer (AsyncJsonWebsocketConsumer):
    slight_ordering = True

    async def connect (self):
        self.user = self.scope["user"]
        await self.accept()
        group_name = "notifications_{}".format(self.user.employee.pk)
        await self.channel_layer.group_add(group_name, self.channel_name)

    async def disconnect (self, code):
        self.user = self.scope["user"]
        group_name = "notifications_{}".format(self.user.employee.pk)
        await self.channel_layer.group_discard (group_name, self.channel_name)

    async def user_notification (self, event):
        await self.send_json(event)

Уведомление отправляется при создании с использованием сигнала post_save:

@receiver(post_save, sender=Notification)
def new_notification (sender, instance, **kwargs):
    channel_layer = get_channel_layer()
    group_name = "notifications_{}".format(instance.employee.pk)
    async_to_sync(channel_layer.group_send)(
       group_name, {
           "type": "user.notification",
           "event": "New notification",
           "notification_pk": instance.pk,
       }
    )

Моя маршрутизация выглядит так:

application = ProtocolTypeRouter({
    'websocket': AuthMiddlewareStack(
        URLRouter(
            [url(r'^notifications/$', NotificationConsumer),]
        )
    ),
})

И, наконец, я использую WebSocketBridge на внешнем интерфейсе:

const webSocketBridge = new channels.WebSocketBridge();
webSocketBridge.connect('/notifications/');
webSocketBridge.listen(function(action, stream){
   //show the notification
});

Если у кого-то есть представление о том, что может происходить и почему я получаю эту ошибку self.receive_lock.locked (), я был бы очень признателен.

Спасибо

1 Ответ

0 голосов
/ 29 марта 2019

Эта проблема была исправлена ​​в channel-redis версии 2.3.3 Обновление каналов-редис до 2.3.3 В случае, если это приведет к дальнейшим ошибкам или не поддерживает вашу установку, перейдите по ссылке ниже, чтобы обновить файл core.py. Хотя редактирование пакета не рекомендуется, это исправит проблему блокировки. Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...