Ho tre tipi di dati che sono in diversi formati; per ogni tipo di dati, esiste uno script Python che lo trasforma in un unico formato unificato.
Questo script Python è lento e associato alla CPU (a un singolo core su una macchina multi-core), quindi voglio eseguirne tre istanze - una per ciascun tipo di dati - e combinare il loro output per passarlo sort
. Fondamentalmente, equivalente a questo:
{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n
Ma con i tre script eseguiti in parallelo.
Ho trovato questa domanda in cui GNU split
veniva utilizzato per eseguire il round robin di un flusso stdout tra n istanze di uno script che gestisce il flusso.
Dalla pagina man divisa:
-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
Quindi il r/N
comando implica " senza dividere le linee ".
Sulla base di questo, sembra che la seguente soluzione dovrebbe essere fattibile:
split -n r/3 -u --filter="./choose_script" << EOF
> 1
> 2
> 3
> EOF
Dove lo choose_script
fa:
#!/bin/bash
{ read x; ./handle_$x.py; }
Sfortunatamente, vedo un po 'di mescolanza di linee - e molte nuove linee che non dovrebbero esserci.
Ad esempio, se sostituisco i miei script Python con alcuni semplici script bash che fanno questo:
#!/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;
Vedo questo output:
1-8394
2-11238
2-22757
1-723
2-6669
3-3690
2-892
2-312511-24152
2-9317
3-5981
Questo è fastidioso - basato sull'estratto della pagina man che ho incollato sopra, dovrebbe mantenere l'integrità della linea.
Ovviamente funziona se rimuovo l' -u
argomento, ma poi viene bufferizzato e finirò la memoria perché bufferizza l'output di tutti gli script tranne uno.
Se qualcuno ha qualche intuizione qui sarebbe molto apprezzato. Sono fuori di qui.
job1.py > file1 & job2.py > file 2 & job3.py > file3 ; wait ; sort -n file1 file2 file3
?
coproc
builtin in bash, anche se non vedo davvero come si applica.