Ich habe drei Arten von Daten, die in verschiedenen Formaten vorliegen. Für jeden Datentyp gibt es ein Python-Skript, das ihn in ein einheitliches Format umwandelt.
Dieses Python-Skript ist langsam und CPU-gebunden (an einen einzelnen Kern auf einem Multi-Core-Computer). Daher möchte ich drei Instanzen davon ausführen - eine für jeden Datentyp - und deren Ausgabe kombinieren, um sie weiterzuleiten sort
. Grundsätzlich gleichbedeutend damit:
{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n
Aber mit den drei Skripten, die parallel laufen.
Ich fand diese Frage, bei der GNU split
verwendet wurde, um einen Standard-Stream zwischen n Instanzen eines Skripts, das den Stream verarbeitet, abzurunden.
Aus der geteilten Manpage:
-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
Der r/N
Befehl impliziert also " ohne Linien zu teilen ".
Auf dieser Grundlage scheint die folgende Lösung machbar zu sein:
split -n r/3 -u --filter="./choose_script" << EOF
> 1
> 2
> 3
> EOF
Wo choose_script
macht das:
#!/bin/bash
{ read x; ./handle_$x.py; }
Leider sehe ich eine Vermischung von Zeilen - und viele neue Zeilen, die nicht vorhanden sein sollten.
Wenn ich beispielsweise meine Python-Skripte durch einige einfache Bash-Skripte ersetze, die dies tun:
#!/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;
Ich sehe diese Ausgabe:
1-8394
2-11238
2-22757
1-723
2-6669
3-3690
2-892
2-312511-24152
2-9317
3-5981
Dies ist ärgerlich - basierend auf dem oben eingefügten Manpage-Auszug sollte die Zeilenintegrität erhalten bleiben.
Natürlich funktioniert es, wenn ich das -u
Argument entferne , aber dann ist es gepuffert und mir geht der Speicher aus, da es die Ausgabe aller Skripte bis auf eines puffert.
Wenn jemand hier einen Einblick hat, wäre er sehr dankbar. Ich bin hier überfordert.
job1.py > file1 & job2.py > file 2 & job3.py > file3 ; wait ; sort -n file1 file2 file3
?
coproc
eingebaute Bash ansehen, obwohl ich nicht wirklich sehe, wie es zutrifft.