asyncio.create_task装饰器不能同时执行。

问题描述 投票:0回答:1

我在理解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())
python python-asyncio python-decorators
1个回答
2
投票

有一个区别。

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())
© www.soinside.com 2019 - 2024. All rights reserved.