Python 异步IO信号量和等待任务排序模式

Python 异步IO信号量和等待任务排序模式,python,python-asyncio,Python,Python Asyncio,考虑以下代码来管理具有相同异步任务的并发性 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 task

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

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 0 14 1 15 2 16 18

  • 问题1。我的任务排序的逻辑是什么
  • 问题2。如果我希望以近似的插入顺序处理任务,该怎么办?也就是说,就像在有限并发的队列中工作一样
提前谢谢

正如Andrew Svetlov(asyncio开发者)所回答的:

订单未被
.wait()
规范检测到

如果在另一台机器上启动脚本,将得到不同的结果。如果您想对任务执行施加命令,您可以在循环中等待它们,或者在协同程序中使用异步IO,例如
事件
条件