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

Concurrent Shell Command Queues

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

Автор реализует пул потоков на чистом 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.
  1. 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` и требует чего-то более хитрого.

  2. 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

  3. 0cf8612b2e1e

    Мне очень нравится pueue для этого. Что-то вроде лёгкого slurm или parallel без надоедливого уведомления о цитировании.

    https://github.com/Nukesor/pueue

Ещё за этот день

2026-11-13