Saya memiliki tiga jenis data yang dalam format berbeda; untuk setiap tipe data, ada skrip Python yang mengubahnya menjadi satu format tunggal.
Skrip Python ini lambat dan terikat CPU (ke satu inti pada mesin multi-inti), jadi saya ingin menjalankan tiga contoh - satu untuk setiap tipe data - dan menggabungkan output mereka untuk meneruskannya sort
. Pada dasarnya, setara dengan ini:
{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n
Tetapi dengan tiga skrip berjalan secara paralel.
Saya menemukan pertanyaan ini di mana GNU split
digunakan untuk membulatkan beberapa aliran stdout antara n contoh skrip yang menangani aliran.
Dari halaman manual 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
Jadi r/N
perintah itu menyiratkan " tanpa garis pemisah ".
Berdasarkan ini, sepertinya solusi berikut harus layak:
split -n r/3 -u --filter="./choose_script" << EOF
> 1
> 2
> 3
> EOF
Di mana choose_script
ini:
#!/bin/bash
{ read x; ./handle_$x.py; }
Sayangnya, saya melihat beberapa jalinan garis - dan banyak baris baru yang seharusnya tidak ada di sana.
Misalnya, jika saya mengganti skrip Python saya dengan beberapa skrip bash sederhana yang melakukan ini:
#!/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;
Saya melihat output ini:
1-8394
2-11238
2-22757
1-723
2-6669
3-3690
2-892
2-312511-24152
2-9317
3-5981
Ini menjengkelkan - berdasarkan pada ekstrak halaman manual yang saya tempel di atas, itu harus menjaga integritas garis.
Jelas itu berfungsi jika saya menghapus -u
argumen, tetapi kemudian buffered dan saya akan kehabisan memori karena buffer output semua kecuali satu skrip.
Jika ada yang memiliki wawasan di sini, itu akan sangat dihargai. Saya keluar dari kedalaman saya di sini.
job1.py > file1 & job2.py > file 2 & job3.py > file3 ; wait ; sort -n file1 file2 file3
?
coproc
builtin di bash, meskipun saya tidak benar-benar melihat bagaimana itu berlaku.