Bash만으로 동시성 제한 명령 큐를 만든 방법
Concurrent Shell Command Queues

Bash에서 스레드 풀처럼 동시 실행 수를 제한하는 명령 큐를 구현하는 방법을 소개한다. mkfifo로 큐 파일을 만들고 xargs -P로 동시성을 관리하는 queue_start, queue_submit, queue_wait 세 함수로 구성되며, 실행할 명령을 미리 알 필요 없이 시간에 따라 제출할 수 있다. Bash와 Zsh에서 동작하고 서브셸 간 큐 상속도 지원하지만, 셸당 큐 하나, 출력 스트리밍 불가, 종료 시 하위 프로세스 일괄 종료 같은 한계도 있다. 저자는 Bash에 대한 애정으로 도전했을 뿐, 솔직히 Python 같은 언어가 낫다고 인정한다.
당신이 옳습니다. 그리고 제 답은 이렇습니다. 저는 Bash를 좋아하고, 그 도전이 하고 싶었기 때문입니다. 그래도 아마 Python 같은 다른 언어를 쓰는 편이 더 나을 겁니다.
HN 토론
16- js2
> 셸 명령을 병렬로 실행하면서 동시성을 제한하는 방법.
작업에 따라 Makefile을 생성하고 다음으로 실행하세요:
make -j <concurrency>
> 제 원래 사용 사례는 대량의 웹 요청을 만드는 것과 관련이 있었습니다
사실 이 사용 사례 때문에 아마 20년 전쯤 Makefile을 동시성에 사용할 생각을 했던 것 같습니다. 각 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
GNU Parallel의 sem도 있습니다: 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 같으면서도 인용 공지가 귀찮게 나오지 않죠.