簡體   English   中英

Python WebSockets 使用 socketio 和 eventlet - 無法殺死 eventlet 服務器

[英]Python WebSockets using socketio and eventlet - cannot kill eventlet server

我將 websocket 服務器添加到我的應用程序中,以便它可以與基於 Web 的版本進行通信。 為此,我正在使用 eventlet。

我遇到的問題是一旦我啟動服務器,我就不能讓它死掉。 即使我關閉了我的應用程序,該進程仍會在服務器保持活動狀態時在后台運行。 幾天來,我一直在谷歌搜索和測試隨機的東西,但無法實現。 我希望這里有人可以幫助我。

目前,我有一個 singleton class 和一個 function 開始監聽:

    def run_server(self, addr, port):
        eventlet.wsgi.server(eventlet.listen((addr, port)), self.APP)

對於信息,該應用程序是:

socketio.WSGIApp(SIO, static_files={'/': {'content_type': 'text/html',
                                                    'filename': 'index.html'}})

然后我在應用程序的一個線程上啟動這個服務器:

def run_on_thread(addr, port):
    obj = WebSocket()
    t = threading.Thread(target=obj.run_server, args=(addr, port))
    t.setDaemon(True)
    return obj, t

該線程在我的應用程序中啟動,並且如上所述 - 一切正常。 我所有的消息都被發送和接收。

但是在我結束 python 進程上的任務之前,我找不到任何東西會殺死這個服務器。

eventlet web 服務器當前在使用 WebSocket 時沒有良好的停止機制。 以下警告在文檔中:

警告:此時 server() 將始終等待活動連接完成后再退出,即使其中引發了異常(所有異常都以相同的方式處理,包括 greenlet.GreenletExit 和繼承自 BaseException 的異常)。

雖然這通常不是問題,但當涉及到長時間運行的 HTTP 連接(如 eventlet.websocket)時,它會出現問題,並且在運行服務器的線程上調用 wait() 可能會掛起,即使在使用 kill() 之后也是如此,因為只要有活動的連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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