使用 Python Websockets 库的多线程服务器
Multithreaded server using Python Websockets library
我正在尝试使用 Python Websockets 库构建服务器和客户端。我正在按照此处给出的示例进行操作:Python OCPP documentation。我想编辑此示例,以便对于每个新客户端(Charge Point),服务器(中央系统)在新线程上运行(或新循环,因为 Websockets 库使用 Python 的 asyncio)。基本上我想同时接收来自多个客户端的消息。我修改了服务器(中央系统)的主要方法,从我遵循的示例中,通过在 websockets.serve() 中添加一个循环参数,希望每当新客户端运行时,它都会在不同的循环中运行:
async def main():
server = await websockets.serve(
on_connect,
'0.0.0.0',
9000,
subprotocols=['ocpp2.0'],
ssl=ssl_context,
loop=asyncio.new_event_loop(),
ping_timeout=100000000
)
await server.wait_closed()
if __name__ == '__main__':
asyncio.run(main())
我收到以下错误。请帮助:
RuntimeError:
Task <Task pending coro=<main() running at server.py:36>
cb=_run_until_complete_cb() at /usr/lib/python3.7/asyncio/base_events.py:153]>
got Future <_GatheringFuture pending> attached to a different loop - sys:1:
RuntimeWarning: coroutine 'BaseEventLoop._create_server_getaddrinfo' was never awaited
这里是 OCPP 包的作者。项目中的示例能够使用 1 个事件循环处理多个客户端。
您的示例中的问题是 loop=asyncio.new_event_loop()
。 websocket.serve()
在 'main' 事件循环中被调用。但是您将对第二个事件循环的引用传递给它。这会导致 future 附加到创建它的不同事件循环。
您应该避免 运行 多个事件循环。
我正在尝试使用 Python Websockets 库构建服务器和客户端。我正在按照此处给出的示例进行操作:Python OCPP documentation。我想编辑此示例,以便对于每个新客户端(Charge Point),服务器(中央系统)在新线程上运行(或新循环,因为 Websockets 库使用 Python 的 asyncio)。基本上我想同时接收来自多个客户端的消息。我修改了服务器(中央系统)的主要方法,从我遵循的示例中,通过在 websockets.serve() 中添加一个循环参数,希望每当新客户端运行时,它都会在不同的循环中运行:
async def main():
server = await websockets.serve(
on_connect,
'0.0.0.0',
9000,
subprotocols=['ocpp2.0'],
ssl=ssl_context,
loop=asyncio.new_event_loop(),
ping_timeout=100000000
)
await server.wait_closed()
if __name__ == '__main__':
asyncio.run(main())
我收到以下错误。请帮助:
RuntimeError:
Task <Task pending coro=<main() running at server.py:36>
cb=_run_until_complete_cb() at /usr/lib/python3.7/asyncio/base_events.py:153]>
got Future <_GatheringFuture pending> attached to a different loop - sys:1:
RuntimeWarning: coroutine 'BaseEventLoop._create_server_getaddrinfo' was never awaited
这里是 OCPP 包的作者。项目中的示例能够使用 1 个事件循环处理多个客户端。
您的示例中的问题是 loop=asyncio.new_event_loop()
。 websocket.serve()
在 'main' 事件循环中被调用。但是您将对第二个事件循环的引用传递给它。这会导致 future 附加到创建它的不同事件循环。
您应该避免 运行 多个事件循环。