Как исправить, что потребители каналов django перестают обрабатывать сообщения, отправленные группам

Отправка сообщений в группы с использованием group_send() внезапно перестает работать через некоторое время. Метод-обработчик потребителя больше не вызывается.

Перезапуск daphne на некоторое время решит проблему.

Подробности

Никаких ошибок в журналах нет, просто сообщения больше не обрабатываются потребителями.

Я использую следующие библиотеки:

  • aioredis == 1.2.0
  • asgiref == 2.3.2
  • каналы-redis == 2.3.2
  • каналы == 2.1.6
  • дафна == 2.2.4
  • django == 2.1.5
  • Redis == 3.0.1

Код

# settings.py
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {"hosts": [("localhost", "6379")]},
    }
}
# views.py
class ReceiveEventView(APIView):
    def post(self, request, *args, **kwargs):
        # payload: {"type": "event_triggered", "group": "warning", "message": "Button pressed"}
        # or
        # payload: {"type": "event_triggered", "group": "danger", "message": "Red Button pressed"}
        payload = json.loads(request.POST.get("payload", "{}"))
        if (payload.get("type") == "event_triggered"):
            async_to_sync(channel_layer.group_send)(payload.get("group"), payload)
        return HttpResponse(status=204)
# consumers.py
class EventConsumer(WebsocketConsumer):
    def connect(self):
        if not self.scope["user"].is_authenticated:
            return
        self.accept()
        for group in get_subscriptions(self.scope["user"]):
            async_to_sync(self.channel_layer.group_add)(group, self.channel_name)

    def disconnect(self, close_code):
        if not self.scope["user"].is_authenticated:
            return
        for group in get_subscriptions(self.scope["user"]):
            async_to_sync(self.channel_layer.group_discard)(group, self.channel_name)

    def event_triggered(self, event):
        logger.debug("Consumer::event_triggered()")
        self.send(text_data=json.dumps(event))

ожидаемые и фактические результаты

Некоторое время Consumer::event_triggered() появляется в логе, но внезапно останавливается. Получение сообщений из браузера через WebSocket по-прежнему работает. Просто транспорт от group_send() до потребителей сломан.


person JanMalte    schedule 30.01.2019    source источник
comment
Какую версию Python вы используете? 3.5.2? похоже, есть известная ошибка в сочетании этой версии и каналов   -  person Ken4scholars    schedule 31.01.2019
comment
Я использую Python 3.5.3   -  person JanMalte    schedule 31.01.2019
comment
Я скомпилировал Python 3.6.8 и посмотрю на него. Надеюсь, он будет работать без проблем до завтра. Спасибо за подсказку относительно версии Python.   -  person JanMalte    schedule 31.01.2019
comment
Отлично, я отправил это как ответ, если это сработает, не забудьте принять ответ   -  person Ken4scholars    schedule 31.01.2019


Ответы (2)


Существует известная ошибка, приводящая через некоторое время к разрыву соединений для работающих приложений каналов. в Python 3.5. Обновите Python 3.6 для возможного исправления

person Ken4scholars    schedule 31.01.2019
comment
В очередной раз благодарим за помощь. Это действительно была проблема с Python 3.5. Запуск моего приложения с Python 3.6 не показывает эту проблему. - person JanMalte; 04.02.2019

Я столкнулся с этой проблемой с Python3.8. Поэтому я исправил это, переключившись на Python3.6.

Каналы Django - Клиент иногда получает сообщение, а в других случаях - пока не перестанет получать его вообще

person Newbie    schedule 04.08.2020
comment
да! я тоже, я пробовал также python3.9, но у него такая же проблема. Я исправил переход на python3.6 - person lorenzo_campanile; 13.04.2021