簡體   English   中英

Django 通道錯誤“關閉時間過長並被殺死”。

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM