asyncio.create_task 装饰器没有并发执行
asyncio.create_task decorator doesn't execute concurrently
我在理解 asyncio 的 create_task 函数时遇到了一些问题。根据文档,任务在等待时应该 运行 同时进行。我将异步函数包装在 deocrator 中,因此我不必为每个异步函数都使用 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())
第二个在继续之前等待任务完成,因此您仅在 bar 完成后才安排 foo。
首先创建任务然后等待它们:
foo_task = foo()
bar_task = bar()
await foo_task
await bar_task
或使用asyncio.gather
await asyncio.gather(foo(), bar())
我在理解 asyncio 的 create_task 函数时遇到了一些问题。根据文档,任务在等待时应该 运行 同时进行。我将异步函数包装在 deocrator 中,因此我不必为每个异步函数都使用 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())
第二个在继续之前等待任务完成,因此您仅在 bar 完成后才安排 foo。
首先创建任务然后等待它们:
foo_task = foo()
bar_task = bar()
await foo_task
await bar_task
或使用asyncio.gather
await asyncio.gather(foo(), bar())