семафор asyncio и шаблоны порядка задач ожидания - PullRequest
0 голосов
/ 04 августа 2020

Рассмотрим следующий код для управления параллелизмом с идентичными асинхронными c задачами

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. Что такое logi c для этого порядка моих задач?
  • Вопрос 2. Что, если я хочу, чтобы задачи обрабатывались в приблизительной вставке порядок? Т.е. как работа через очередь с ограниченным параллелизмом.

Заранее спасибо!

1 Ответ

1 голос
/ 04 августа 2020

Как ответил Андрей Светлов (разработчик asyncio) здесь :

Порядок undetermenisti c по спецификации .wait().

Если вы запустите свой скрипт на другой машине, вы получите другой результат. Если вы хотите наложить порядок выполнения задач, вы можете просто await для них в al oop или использовать asyncio примитив синхронизации , например Event или Condition в сопрограммах.

...