Как передать asyncio.get_event_loop() в кварту в командной строке?

В документе они передали цикл обработки событий в кварту. Необходимо вызвать асинхронный метод в обработчике маршрута.

Как изменить это в командной строке для героку?

if __name__ == '__main__':
    loop=asyncio.get_event_loop()
    app.run(loop=loop)

Я пытался

web: hypercorn  -b 0.0.0.0:${PORT} --workers=1 telegram:app -k asyncio

Но все же получил

2019-06-22 10:00:45.047703 app[web.1]:  Task <Task pending coro=<ASGIWebsocketConnection.handle_websocket() running at /app/.heroku/python/lib/python3.7/site-packages/quart/asgi.py:135> cb=[_wait.<locals>._on_completion() at /app/.heroku/python/lib/python3.7/asyncio/tasks.py:440]> got Future <Future pending> attached to a different loop
2019-06-22 10:00:45.048350 app[web.1]:  Traceback (most recent call last):
2019-06-22 10:00:45.048395 app[web.1]:  File "/app/tele.py", line 34, in create_contact
2019-06-22 10:00:45.048399 app[web.1]:  contacts =await client2(functions.contacts.ImportContactsRequest([contact]))
2019-06-22 10:00:45.048410 app[web.1]:  File "/app/.heroku/python/lib/python3.7/site-packages/telethon/client/users.py", line 60, in __call__
2019-06-22 10:00:45.048414 app[web.1]:  result = await future
2019-06-22 10:00:45.048458 app[web.1]:  RuntimeError: Task <Task pending coro=<ASGIWebsocketConnection.handle_websocket() running at /app/.heroku/python/lib/python3.7/site-packages/quart/asgi.py:135> cb=[_wait.<locals>._on_completion() at /app/.heroku/python/lib/python3.7/asyncio/tasks.py:440]> got Future <Future pending> attached to a different loop

Следите за этим вопросом


Как получить цикл событий из Quart, здесь сказано, что app.run() в quart использует цикл событий по умолчанию, созданный asyncio для основного потока. Тогда почему они пропускают цикл?

2 ответа

Потому что hypercorn не пойдет внутрь if __main__, вам нужно заранее создать цикл и установить его по умолчанию:

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
# do whatever you want, e.g.: 
# loop.create_task(background())

if __name__ == '__main__':
    loop = asyncio.get_event_loop()  # now unnecessary
    app.run(loop=loop)

# should be just
if __name__ == '__main__':
    app.run()

Открытие клиента внутри before_serving решило эту проблему.

Другие вопросы по тегам