我在理解asyncio的create_task函数时遇到了一些问题。从文档中看,当任务被等待时,它们应该是并发运行的。我把asynnc func包装在一个deocrator中,这样我就不用为每个asynnc函数都去create_task()了。但并发执行失败
import asyncio
import time
def async_task(func):
def wrapper():
return asyncio.create_task(func())
return wrapper
@async_task
async def bar() -> int:
await asyncio.sleep(3)
return "hello"
@async_task
async def foo() -> int:
await asyncio.sleep(3)
return "world"
async def main() -> None:
print(time.strftime('%X'))
print(await bar())
print(await foo())
print(time.strftime('%X'))
asyncio.run(main())
有一个区别。
asyncio.create_task(async_fun())
和
await asyncio.create_task(async_fun())
第二种是等待任务完成后再前进,所以你是在吧完成后才调度foo。
先创建任务再等待任务。
foo_task = foo()
bar_task = bar()
await foo_task
await bar_task
或者使用 asyncio.gather
await asyncio.gather(foo(), bar())