[英]Django channel Error "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
,因此 function 將在您沒想到時繼續運行。
AsyncHttpConsumer
還有一個關於未在handle()
中顯示異常的開放錯誤報告。 目前唯一的選擇是添加額外的打印/記錄行來確定什么正在運行/沒有運行。
當心 django-debug-toolbar
另外值得注意的是,將debug-toolbar
添加到您的INSTALLED_APPS
將使異步使用者中的異常靜音。 請參閱此處的討論。 謹防!
我解決了這個錯誤。 嘗試刪除您的環境並創建一個新環境。 錯誤將消失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.