使用websockets lib和Python3.7启动服务器的适当方法

问题描述 投票:2回答:1

documentation for the library显示以下代码应该达成交易,它确实有效:

start_server = websockets.serve(hello, 'localhost', 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

但是新的Python-3.7 asyncio library添加了asyncio.run,它“运行pass coroutine”和“应该用作asyncio程序的主要入口点。”此外,在查看上面使用的documentation for the get_event_loop()时,它显示:

应用程序开发人员通常应该使用高级asyncio函数,例如asyncio.run()......

我尝试以下列方式使用run:

server = websockets.serve(hello, 'localhost', 8765)
asyncio.run(server)

从中得到一个:

ValueError: a coroutine was expected, got <websockets.server.Serve object at 0x7f80af624358>
sys:1: RuntimeWarning: coroutine 'BaseEventLoop.create_server' was never awaited

然后我尝试通过执行以下操作在Service中包装服务器:

server = asyncio.create_task(websockets.serve(handle, 'localhost', 8765))
asyncio.run(server)

从中得到一个:

RuntimeError: no running event loop
sys:1: RuntimeWarning: coroutine 'BaseEventLoop.create_server' was never awaited

由于这最后的警告,我也尝试过:

async def main():
  server = asyncio.create_task(websockets.serve(hello, 'localhost', 8765))
  await server
asyncio.run(main())

我得到了同样的错误。我在这里错过了什么?此外,如果asyncio.run没有启动正在运行的循环,它会做什么?

python websocket python-3.7
1个回答
3
投票

这应该工作。 wait_closed是您一直在寻找的等待。

 async def serve():                                                                                           
      server = await websockets.serve(hello, 'localhost', 8765)
      await server.wait_closed()

 asyncio.run(serve())
© www.soinside.com 2019 - 2024. All rights reserved.