【问题标题】:asyncio semaphore and wait task ordering patterns异步信号量和等待任务排序模式
【发布时间】:2020-11-24 19:15:19
【问题描述】:

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

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

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

提前致谢!

【问题讨论】:

    标签: python python-asyncio


    【解决方案1】:

    正如 Andrew Svetlov(asyncio 开发人员)回答 here

    .wait() 规范无法确定该顺序。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 2014-09-06
      • 1970-01-01
      相关资源
      最近更新 更多