首页 > 解决方案 > 异步信号量和等待任务排序模式

问题描述

考虑以下代码来管理具有相同异步任务的并发性

import asyncio

async def performTask(id):

  await asyncio.sleep(1)
  print(id)


async def runBatchItem(semaphore, task):
  await semaphore.acquire()
  await task
  semaphore.release()


async def main():

  # all tasks
  tasks = [performTask(i) for i in range(20)]

  # concurrency handler
  MAX_CONCURRENT = 3
  semaphore = asyncio.Semaphore(value=MAX_CONCURRENT)
  stasks = [runBatchItem(semaphore, task) for task in tasks]

  await asyncio.wait(stasks)


asyncio.run(main())

无论我多久运行一次,我总是得到以下输出序列

3 19 4 5 6 7 8 17 9 10 11 12 13 0 14 1 15 2 16 18

提前致谢!

标签: pythonpython-asyncio

解决方案


正如 Andrew Svetlov(异步开发人员)在这里回答的那样:

该顺序是不确定的.wait()规范。

如果你在另一台机器上启动你的脚本,你会得到不同的结果。如果您想对任务执行施加顺序,您可以只await在循环中为它们执行或使用异步同步原语,例如协程EventCondition在协程中。


推荐阅读