Подходящий способ запустить сервер, используя websockets lib и Python3.7 - PullRequest
0 голосов
/ 28 февраля 2019

Документация для библиотеки показывает, что следующий код должен помочь, и он действительно работает:

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 добавил asyncio.run, который "запускает сопрограмму pass" * и "должен использоваться в качестве основной точки входа для асинхронных программ." Более того, при просмотре документации для get_event_loop(), использованного выше, он гласит:

Разработчикам приложений обычно следует использовать функции высокого уровня asyncio, такие как asyncio.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

Затем я попытался обернуть сервер в Задачу, выполнив:

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 не запускает рабочий цикл, что он делает?

1 Ответ

0 голосов
/ 01 марта 2019

Это должно работать.wait_closed это то, что вы искали.

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

 asyncio.run(serve())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...