Ошибка канала Django закрылась слишком долго, и она была убита.

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

/home/Python/Working/Benutzerverwaltung/env/lib/python3.6/site-packages/channels/sessions.py:183>
wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at
0x7fab9fe51408>()]>> for connection <WebSocketProtocol
client=['127.0.0.1', 59462] path=b'/ws/stream/Sales'> took too long to
shut down and was killed.

Вот мой код закрытия канала.

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"
    })

Как это исправить?


person Manoj Datt    schedule 11.07.2020    source источник


Ответы (1)


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

Этот конкретный случай

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

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

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 отключит исключения в ваших асинхронных потребителях. См. Обсуждение здесь. Остерегаться!

person Ben Sturmfels    schedule 26.08.2020