我在控制台日志中收到了这个错误,在表单提交时,它一直在加载,不会将数据发布到服务器。
/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。错误将消失。