我可以在Python 3.5函数中跳过async def
关键字,我的代码仍然可以异步工作吗?
这样的事情:
async def sleep():
await asyncio.sleep(1)
def mysleep():
loop = asyncio.get_event_loop()
loop.await(sleep)
def main():
mysleep()
答案 0 :(得分:4)
正如文森特注意到,如果你改变你的代码,那么它将毫无错误地发挥作用:
import asyncio
async def sleep():
await asyncio.sleep(1)
def mysleep():
loop = asyncio.get_event_loop()
loop.run_until_complete(sleep())
def main():
mysleep()
if __name__ == '__main__':
main()
答案是 - 它仅在mysleep()
函数内部异步工作(并且可以在那里得到相关benefit),但它阻止了mysleep()
之外的所有内容。这意味着mysleep()
本身或任何外部代码不能与其他异步函数一起异步运行。
要避免这种情况,您应该在大多数可能的外部作用域中运行事件循环:从程序的入口点开始生成事件循环。它可以在这个单个事件循环中异步运行所有内容。