【问题标题】:Properly closing websocket on python在 python 上正确关闭 websocket
【发布时间】:2018-04-16 00:28:28
【问题描述】:

我在 python 上使用 websockets 库在自定义线程中创建 websockets 服务器:

    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    async def listener(websocket, path):
        async for message in websocket:
            self.onMessage.emit(message)

    self._server=websockets.serve(listener, 'localhost', 8765)
    asyncio.get_event_loop().run_until_complete(self._server)
    asyncio.get_event_loop().run_forever()

    print("Finished...")

现在我想彻底停止此服务器,但似乎我遗漏了一些东西。从文档中,他们声明要关闭服务器,我唯一要做的就是使用这样的东西(这是从主线程调用的自定义线程类中的一个函数):

def stop(self):
    self._server.ws_server.close()
    self._server.ws_server.wait_closed();

但永远不会打印“完成...”文本。

我误解了文档还是什么?

干杯。

【问题讨论】:

  • 由于wait_closed 是协程,您需要await 或使用run_until_complete 让它运行。
  • 没有注意到它是一个协程,无论如何这不是循环没有结束的原因。

标签: python websocket python-asyncio


【解决方案1】:

好吧,玩了一会儿后,我完成了一个干净的安装:

async def _internalStop(self):
    self._server.ws_server.close()
    await self._server.ws_server.wait_closed()
    self._eventLoop.stop();
    while(self._eventLoop.is_running()):
        time.sleep(0.5)
    self._eventLoop.close();
    self._eventLoop=None;

【讨论】:

    猜你喜欢
    • 2012-02-17
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多