Django 通道错误“关闭时间太长并被杀死”。

Man*_*att 9 django websocket python-3.x django-redis django-channels

我在控制台日志上收到此错误,并且在表单提交时它会不断加载,但不会将数据发布到服务器。

/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.
Run Code Online (Sandbox Code Playgroud)

这是我关闭通道的代码。

/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.
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

Ben*_*els 10

这个错误主要是因为协程的停留时间超过了应有的时间。

这个具体案例

在这种情况下,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
)
Run Code Online (Sandbox Code Playgroud)

不需要await self.close(),因为断开连接已经发生。删除该行。

异步Http消费者

类似地,AsyncHttpConsumer我经常犯的错误是调用await self.send_response(...)但随后忘记调用return,因此该函数将在您不期望的时候继续运行。

AsyncHttpConsumer还有一个关于未在handle(). 当前唯一的选择是添加额外的打印/日志记录行来找出正在运行/未运行的内容。

当心 django-debug-toolbar

另外值得注意的是,添加debug-toolbar到您的INSTALLED_APPS意志中会消除异步消费者中的异常。请参阅此处的讨论。谨防!