J'ai trois types de données qui sont dans différents formats; pour chaque type de données, il existe un script Python qui le transforme en un seul format unifié.
Ce script Python est lent et lié au CPU (à un seul cœur sur une machine multi-cœur), donc je veux en exécuter trois instances - une pour chaque type de données - et combiner leur sortie pour la transmettre sort
. Fondamentalement, équivalent à ceci:
{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n
Mais avec les trois scripts fonctionnant en parallèle.
J'ai trouvé cette question où GNU split
était utilisé pour effectuer un round-robin sur un flux standard entre n instances d'un script qui gère le flux.
À partir de la page de manuel fractionnée:
-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
La r/N
commande implique donc " sans séparer les lignes ".
Sur cette base, il semble que la solution suivante devrait être réalisable:
split -n r/3 -u --filter="./choose_script" << EOF
> 1
> 2
> 3
> EOF
Où choose_script
est-ce:
#!/bin/bash
{ read x; ./handle_$x.py; }
Malheureusement, je vois un mélange de lignes - et beaucoup de nouvelles lignes qui ne devraient pas être là.
Par exemple, si je remplace mes scripts Python par des scripts bash simples qui font ceci:
#!/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;
Je vois cette sortie:
1-8394
2-11238
2-22757
1-723
2-6669
3-3690
2-892
2-312511-24152
2-9317
3-5981
C'est ennuyeux - sur la base de l'extrait de page de manuel que j'ai collé ci-dessus, il devrait maintenir l'intégrité de la ligne.
Évidemment, cela fonctionne si je supprime l' -u
argument, mais il est mis en mémoire tampon et je manquerai de mémoire car il met en mémoire tampon la sortie de tous les scripts sauf un.
Si quelqu'un a un aperçu ici, ce serait grandement apprécié. Je suis hors de ma profondeur ici.
job1.py > file1 & job2.py > file 2 & job3.py > file3 ; wait ; sort -n file1 file2 file3
?
coproc
module intégré dans bash, bien que je ne vois pas vraiment comment cela s'applique.