使用 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 附加到创建它的不同事件循环。

您应该避免 运行 多个事件循环。