Как передать asyncio.get_event_loop () в кварту в командной строке? - PullRequest
0 голосов
/ 22 июня 2019

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

Как поменять это на командную строку для героку?

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

Следующий вопрос для this


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

Ответы [ 2 ]

1 голос
/ 12 июля 2019

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

1 голос
/ 27 июня 2019

Поскольку 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()
...