Django Ошибка канала «отключение потребовалось слишком много времени, и он был убит». - PullRequest
1 голос
/ 12 июля 2020

Я получаю эту ошибку в журнале консоли, и при отправке формы она продолжает загружаться, не отправляя данные на сервер.

/ home / Python / Working / Benutzerverwaltung / env / lib / python3 .6 / сайт-пакеты / каналы / sessions.py: 183> wait_for = ()] >> для подключения отключение потребовалось слишком много времени, и он был убит.

Я пробовал несколько решений, представленных на inte rnet, но, к сожалению, никто не работал. Вот мой код для закрытия канала.

    async def disconnect(self, code):
        async_to_sync(self.channel_layer.group_discard)(
            self.room_group_name,
            self.channel
        )
        await self.close()

    async def websocket_disconnect(self, event):
        print("Disconnect", event)
        await self.send({
            "type": "websocket.close"
        })

Любой, кто знает об этой проблеме и может помочь мне ее исправить, будет очень полезным. потому что это происходит на производстве.

1 Ответ

1 голос
/ 26 августа 2020

В целом эта ошибка возникает из-за того, что сопрограмма висит дольше, чем должна.

Это указывает c case

В этом случае AsyncWebsocketConsumer.websocket_disconnect() переопределяется, но не вызывает super(), что означает, что StopConsumer() не запускается (см. channels / generic / websocket.py: 228 ). Возможно, вообще не отменяйте websocket_disconnect, поскольку в этом примере нет ничего, что могло бы его оправдать.

Также обратите внимание, что async_to_sync предназначен для потребителей syn c, но это асинхронный c потребитель. Вместо этого используйте:

await self.channel_layer.group_discard(
    self.room_group_name,
    self.channel
)

await self.close() не требуется, поскольку отключение уже произошло. Удалите эту строку.

AsyncHttpConsumer

Точно так же в AsyncHttpConsumer я часто совершаю ошибку, когда звоню await self.send_response(...), но потом забываю позвонить return впоследствии, поэтому функция продолжит работу, когда вы этого не ожидали.

AsyncHttpConsumer также имеет открытый отчет об ошибке о том, что исключения не появляются внутри handle(). Единственный вариант в настоящее время - добавить дополнительные строки печати / регистрации, чтобы выяснить, что работает / не работает.

Остерегайтесь django -debug-toolbar

Также стоит отметить, что добавление debug-toolbar к INSTALLED_APPS отключит исключения в ваших асинхронных c потребителях. См. Обсуждение здесь . Осторожно!

...