繁体   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