我有以下课程来打开我的websockets:
import os
import asyncio
import websockets
import threading
class Server:
def get_port(self):
return os.getenv('WS_PORT', '9002')
def get_host(self):
return os.getenv('WS_HOST', 'localhost')
def shutdown(self):
self.loop.call_soon_threadsafe(self.loop.stop)
def start(self):
return websockets.serve(self.handler, self.get_host(), self.get_port())
接下来是传入消息的一些异步处理方法。获取消息的循环函数在其自己的线程中运行,仅供参考。
我能够终止程序,但是我无法正确关闭套接字,导致它在重启脚本时导致以下错误
OSError: [Errno 10048] error while attempting to bind on address ('127.0.0.1', 9002):
由于端口已在使用中。通常我会使用一些.close()
函数,但是websocket包没有提供这样的功能,所以我想知道我是否可以使用os包或websocket包来完成它?
答案 0 :(得分:1)
讨论了正确的关机过程here。基本思想是使用serve()
方法作为异步上下文管理器。
async with websockets.serve(echo, 'localhost', 9002):
await stop
例如,stop
可以是Future
。致电stop.set_result()
时,await
“会返回”。然后,上下文管理器将正常关闭服务器。
通常,您将使用信号处理程序来触发停止条件(文档中也包含一个示例)。
当框架未使用socket.SO_REUSEADDR
打开套接字时,您也可能会收到错误。 See this question for details.