在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为主线程创建的默认事件循环 那么为什么他们要通过循环呢?
答案 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内部打开客户端可以解决此问题。