Farklı formatlarda üç çeşit veri var; her veri türü için, onu tek bir birleşik formata dönüştüren bir Python betiği vardır.
Bu Python betiği yavaş ve CPU'ya bağlı (çok çekirdekli bir makinede tek bir çekirdeğe), bu yüzden üç örneğini - her veri türü için bir tane - çalıştırmak ve çıktılarını içine geçirmek için birleştirmek istiyorum sort
. Temel olarak, buna eşdeğer:
{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n
Ama üç script paralel olarak çalışıyor.
GNU'nun akışı işleyen bir betiğin n örneği arasında bazı stdout akışını yuvarlamak için kullanıldığı bu soruyu buldum split
.
Bölünmüş adam sayfasından:
-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
Yani r/N
komut " satırları bölmeden " anlamına gelir .
Buna dayanarak, aşağıdaki çözümün mümkün olduğu anlaşılıyor:
split -n r/3 -u --filter="./choose_script" << EOF
> 1
> 2
> 3
> EOF
choose_script
Bu nerede :
#!/bin/bash
{ read x; ./handle_$x.py; }
Ne yazık ki, bazı kesişen çizgiler ve orada olmaması gereken birçok yeni çizgi görüyorum.
Örneğin, Python betiklerimi bunu yapan bazı basit bash betikleriyle değiştirirsem:
#!/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;
Bu çıktıyı görüyorum:
1-8394
2-11238
2-22757
1-723
2-6669
3-3690
2-892
2-312511-24152
2-9317
3-5981
Bu sinir bozucu - yukarıda yapıştırdığım man sayfası özetine dayanarak, satır bütünlüğünü korumalıdır.
Açıkçası, -u
argümanı kaldırırsam çalışır , ancak daha sonra arabelleğe alınır ve komut dosyalarından biri dışındaki her şeyin çıktısını tamponladığı için belleğim tükenir.
Burada bir fikir varsa, çok takdir edilecektir. Burada derinliğimden uzaktayım.
job1.py > file1 & job2.py > file 2 & job3.py > file3 ; wait ; sort -n file1 file2 file3
mısın?
coproc
gerçekten görmeme rağmen, bash içindeki yerleşime bakmam da söylendi .