Как передать 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()