Как дождаться выполнения хотя бы одной асинхронной задачи?
Скажем есть 10 асинхронных задач(напр. запросов). Мы их все 10 выполняем одновременно. Как написать такой код, где понятно, что хотя бы одна из задач завершилась и мы можем взять еще одну в работу?
GrayHorse, необязательно: может быть некий диспетчер, который создаёт новые задачи. И пинать его можно по событию завершения любой из задач (плюс по таймеру?)
Примитив синхронизации, который ограничивает количество параллельно выполняемых задач называется семафором.
И в случае диспетчера, создающего новые задачи, это также относится. Этот диспетчер вызывал бы await semaphore.acquire() при создании задачи, а semaphore.release() вызывалось бы при завершение задачи.
Вот очень примитивный пример как это можно организовать. https://jsfiddle.net/xf7369me/1/
при запуске примера смотрите вывод в консоль
ниже вариант того что падает в консоль
spoiler
Запускаю выполнение задачи 0
Запускаю выполнение задачи 1
Запускаю выполнение задачи 2
Запускаю выполнение задачи 3
Запускаю выполнение задачи 4
Запускаю выполнение задачи 5
Запускаю выполнение задачи 6
Запускаю выполнение задачи 7
Запускаю выполнение задачи 8
Запускаю выполнение задачи 9
Запускаю выполнение задачи 10
Запускаю выполнение задачи 11
Запускаю выполнение задачи 12
Запускаю выполнение задачи 13
Запускаю выполнение задачи 14
Запускаю выполнение задачи 15
Запускаю выполнение задачи 16
Запускаю выполнение задачи 17
Запускаю выполнение задачи 18
Запускаю выполнение задачи 19
Выполнение задачи 7 завершено с ошибкой
Очередная задача завершена с ошибкой. Сейчас:
выполняется 9 задач.
ожидают в очереди 10 задач.
Выполнение задачи 3 успешно завершено
Очередная задача успешно завершено. Сейчас:
выполняется 9 задач.
ожидают в очереди 9 задач.
Выполнение задачи 2 завершено с ошибкой
Очередная задача завершена с ошибкой. Сейчас:
выполняется 9 задач.
ожидают в очереди 8 задач.
Выполнение задачи 0 успешно завершено
Очередная задача успешно завершено. Сейчас:
выполняется 9 задач.
ожидают в очереди 7 задач.
Выполнение задачи 1 успешно завершено
Очередная задача успешно завершено. Сейчас:
выполняется 9 задач.
ожидают в очереди 6 задач.
Выполнение задачи 5 завершено с ошибкой
Очередная задача завершена с ошибкой. Сейчас:
выполняется 9 задач.
ожидают в очереди 5 задач.
Выполнение задачи 12 завершено с ошибкой
Очередная задача завершена с ошибкой. Сейчас:
выполняется 9 задач.
ожидают в очереди 4 задач.
Выполнение задачи 4 успешно завершено
Очередная задача успешно завершено. Сейчас:
выполняется 9 задач.
ожидают в очереди 3 задач.
Выполнение задачи 9 успешно завершено
Очередная задача успешно завершено. Сейчас:
выполняется 9 задач.
ожидают в очереди 2 задач.
Выполнение задачи 10 успешно завершено
Очередная задача успешно завершено. Сейчас:
выполняется 9 задач.
ожидают в очереди 1 задач.
Выполнение задачи 11 успешно завершено
Очередная задача успешно завершено. Сейчас:
выполняется 9 задач.
ожидают в очереди 0 задач.
Выполнение задачи 13 успешно завершено
Очередная задача успешно завершено. Сейчас:
выполняется 8 задач.
ожидают в очереди 0 задач.
Выполнение задачи 8 завершено с ошибкой
Очередная задача завершена с ошибкой. Сейчас:
выполняется 7 задач.
ожидают в очереди 0 задач.
Выполнение задачи 6 успешно завершено
Очередная задача успешно завершено. Сейчас:
выполняется 6 задач.
ожидают в очереди 0 задач.
Выполнение задачи 15 завершено с ошибкой
Очередная задача завершена с ошибкой. Сейчас:
выполняется 5 задач.
ожидают в очереди 0 задач.
Выполнение задачи 17 успешно завершено
Очередная задача успешно завершено. Сейчас:
выполняется 4 задач.
ожидают в очереди 0 задач.
Выполнение задачи 16 завершено с ошибкой
Очередная задача завершена с ошибкой. Сейчас:
выполняется 3 задач.
ожидают в очереди 0 задач.
Выполнение задачи 18 успешно завершено
Очередная задача успешно завершено. Сейчас:
выполняется 2 задач.
ожидают в очереди 0 задач.
Выполнение задачи 14 завершено с ошибкой
Очередная задача завершена с ошибкой. Сейчас:
выполняется 1 задач.
ожидают в очереди 0 задач.
Выполнение задачи 19 успешно завершено
Очередная задача успешно завершено. Сейчас:
выполняется 0 задач.
ожидают в очереди 0 задач.