Eu tenho três tipos de dados que estão em formatos diferentes; para cada tipo de dado, existe um script Python que o transforma em um único formato unificado.
Esse script Python é lento e vinculado à CPU (para um único núcleo em uma máquina com vários núcleos), então eu quero executar três instâncias dele - uma para cada tipo de dados - e combinar sua saída para transmiti-la sort
. Basicamente, equivalente a isso:
{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n
Mas com os três scripts sendo executados em paralelo.
Eu encontrei essa pergunta em que o GNU split
estava sendo usado para alternar entre o fluxo stdout e as instâncias de um script que lida com o fluxo.
Na página do manual dividida:
-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
Portanto, o r/N
comando implica " sem dividir linhas ".
Com base nisso, parece que a seguinte solução deve ser viável:
split -n r/3 -u --filter="./choose_script" << EOF
> 1
> 2
> 3
> EOF
Onde choose_script
é que isto:
#!/bin/bash
{ read x; ./handle_$x.py; }
Infelizmente, vejo algumas misturas de linhas - e muitas linhas novas que não deveriam estar lá.
Por exemplo, se eu substituir meus scripts Python por alguns scripts simples do bash que fazem isso:
#!/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;
Eu vejo esta saída:
1-8394
2-11238
2-22757
1-723
2-6669
3-3690
2-892
2-312511-24152
2-9317
3-5981
Isso é irritante - com base no extrato da página de manual que colei acima, ele deve manter a integridade da linha.
Obviamente funcionará se eu remover o -u
argumento, mas ele será armazenado em buffer e a memória ficará insuficiente, pois armazena em buffer a saída de todos os scripts, exceto um.
Se alguém tiver alguma ideia aqui, seria muito apreciada. Estou fora da minha profundidade aqui.
job1.py > file1 & job2.py > file 2 & job3.py > file3 ; wait ; sort -n file1 file2 file3
?
coproc
built-in no bash, embora eu realmente não veja como ele se aplica.