형식이 다른 세 종류의 데이터가 있습니다. 각 데이터 유형마다 단일 통합 형식으로 변환하는 Python 스크립트가 있습니다.
이 Python 스크립트는 느리고 CPU에 바인딩되어 있으므로 (멀티 코어 머신의 단일 코어에) 각 데이터 유형마다 하나씩 3 개의 인스턴스를 실행하고 출력을 결합하여 전달하려고합니다 sort
. 기본적으로 다음과 같습니다.
{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n
그러나 세 개의 스크립트가 동시에 실행됩니다.
스트림을 처리하는 스크립트의 n 인스턴스간에 stdout 스트림을 라운드 로빈하는 데 GNU 가 사용 된 이 질문을 발견 했습니다split
.
split 맨 페이지에서 :
-n, --number=CHUNKS
generate CHUNKS output files. See below
CHUNKS may be:
N split into N files based on size of input
K/N output Kth of N to stdout
l/N split into N files without splitting lines
l/K/N output Kth of N to stdout without splitting lines
r/N like 'l' but use round robin distributio
따라서이 r/N
명령은 " 줄을 나누지 않고 " 를 의미합니다 .
이를 바탕으로 다음과 같은 솔루션이 가능해야합니다.
split -n r/3 -u --filter="./choose_script" << EOF
> 1
> 2
> 3
> EOF
choose_script
이것은 어디에 있습니까?
#!/bin/bash
{ read x; ./handle_$x.py; }
불행히도, 나는 줄이 서로 섞여 있고 거기에 있어서는 안되는 많은 줄 바꿈이 보입니다.
예를 들어 파이썬 스크립트를 간단한 bash 스크립트로 바꾸면 다음과 같습니다.
#!/bin/bash
# ./handle_1.sh
while true; echo "1-$RANDOM"; done;
.
#!/bin/bash
# ./handle_2.sh
while true; echo "2-$RANDOM"; done;
.
#!/bin/bash
# ./handle_3.sh
while true; echo "3-$RANDOM"; done;
나는이 출력을 본다 :
1-8394
2-11238
2-22757
1-723
2-6669
3-3690
2-892
2-312511-24152
2-9317
3-5981
위에 붙여 넣은 맨 페이지 추출을 기반으로하면 라인 무결성을 유지해야합니다.
분명히 -u
인수를 제거하면 작동 하지만 버퍼링되고 스크립트 중 하나를 제외한 모든 출력을 버퍼링하므로 메모리가 부족합니다.
누구든지 여기에 통찰력이 있다면 크게 감사하겠습니다. 나는 내 깊이에서 벗어났습니다.
job1.py > file1 & job2.py > file 2 & job3.py > file3 ; wait ; sort -n file1 file2 file3
없습니까?
coproc
bash에 내장 된 것을 보라고 들었지만 실제로 어떻게 적용되는지는 알지 못한다.