Как построить очередь команд с ограничением параллелизма прямо в Bash
Concurrent Shell Command Queues

Автор реализует пул потоков на чистом Bash: FIFO-файл через mkfifo плюс xargs -P управляют параллелизмом, а функции queue_start, queue_submit и queue_wait позволяют добавлять команды по мере поступления, а не заранее. Код работает в Bash и Zsh, очереди наследуются подшеллами, но есть оговорки: одна очередь на шелл, вывод не стримится, а _queue_stop без разбора убивает всех потомков. Сам автор признаёт, что проще было бы взять Python.
You'd be right to ask this question, and my answer is: because I have a fondness for Bash, and I wanted the challenge. But you're still probably better off using another language, such as Python.
- js2
> Как запускать shell-команды параллельно, ограничивая их параллелизм.
В зависимости от задачи, сгенерируйте Makefile и запустите его с помощью:
make -j <concurrency>
> Мой изначальный сценарий использования был связан с выполнением большого количества веб-запросов
На самом деле именно этот сценарий заставил меня задуматься об использовании Makefile для параллелизма, вероятно, лет 20 назад. Правило для скачивания каждого URL в файл. Затем простой `make -j <jobs>` с любой желаемой степенью параллелизма и бонус: автоматический пропуск уже скачанных файлов. Например:
BASE := https://example.com/files
FILES := a.txt b.txt c.txt d.txt e.txt
.DELETE_ON_ERROR:
all: $(FILES)
$(FILES):
curl -sS --fail --max-time 30 -o $@ $(BASE)/$@
Или, чтобы повторить один из примеров в посте блога:
SHELL := bash
.SHELLFLAGS := -o pipefail -c
N := 1 2 3 4 5
REQS := $(N:%=req-%)
.PHONY: all $(REQS)
all: $(REQS)
$(REQS): req-%:
@curl -sS --fail-with-body --max-time 10 -X POST -H 'Content-Type: application/json' \
-d '{"request": $*}' https://postman-echo.com/post | jq -c .json
Запустите с помощью:
$ make -O -j 3
> Вам не нужно знать все команды, которые вы хотите выполнить, заранее; вы можете отправлять команды со временем.
А, да, это действительно ставит Make в одну категорию с `xargs -P` / GNU `parallel` и требует чего-то более хитрого.
- reconquestio
Есть также sem из GNU Parallel: https://www.gnu.org/software/parallel/sem.html
sem --id jobs -j 2 'sleep 1; echo FIRST'
sem --id jobs -j 2 'echo SECOND'
sem --id jobs -j 2 'echo THIRD'
sem --id jobs --wait
SECOND
THIRD
FIRST
- 0cf8612b2e1e
Мне очень нравится pueue для этого. Что-то вроде лёгкого slurm или parallel без надоедливого уведомления о цитировании.