姜戈通道错误"took too long to shut down and was killed."



我在控制台日志中收到了这个错误,在表单提交时,它一直在加载,不会将数据发布到服务器。

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

如何解决此问题?

这个错误主要是因为协程停留的时间比它应该停留的时间长。

此特定情况

在这种情况下,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添加到INSTALLED_APPS将使异步消费者中的异常静音。请参阅此处的讨论。当心

文档说明如下:

一旦完成断开连接后的清理,就需要引发channels.exceptions.StopConsumer来干净地停止ASGI应用程序,并让服务器进行清理。如果您不引发此异常而让它继续运行,服务器将达到其应用程序关闭超时(在Daphne中默认为10秒(,然后终止您的应用程序并引发警告。https://channels.readthedocs.io/en/latest/topics/consumers.html#closing-消费者

在websocket_disconnect方法中引发StopConsumer为我修复了该问题。

我解决了这个错误。尝试删除您的env并创建一个新的env。错误将消失。

最新更新