如何通过asyncio.get_event_loop()在命令行中夸脱?

时间:2019-06-22 04:13:40

标签: heroku python-asyncio telethon quart hypercorn

doc中,他们通过事件循环来夸脱。 需要在路由处理程序中调用异步方法。

如何将其更改为heroku的命令行?

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的问题


How to obtain an event loop from Quart 这里说夸脱的app.run()使用asyncio为主线程创建的默认事件循环 那么为什么他们要通过循环呢?

2 个答案:

答案 0 :(得分:1)

由于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()

答案 1 :(得分:1)

before_serving内部打开客户端可以解决此问题。