У мене є три види даних, які є в різних форматах; для кожного типу даних існує сценарій Python, який перетворює його в єдиний єдиний формат.
Цей скрипт Python повільний і пов'язаний з процесором (до одного ядра на багатоядерній машині), тому я хочу запустити три екземпляри цього - по одному для кожного типу даних - і об'єднати їх вихід, щоб передати його sort
. В основному, рівнозначно цьому:
{ ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n
Але з трьома сценаріями, які працюють паралельно.
Я знайшов це запитання, коли GNU split
використовувався для обертання потоку stdout між n екземплярами сценарію, який обробляє потік.
На сторінці розділеної людини:
-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
Отже r/N
команда передбачає " без розбиття рядків ".
Виходячи з цього, видається, що таке рішення повинно бути здійсненним:
split -n r/3 -u --filter="./choose_script" << EOF
> 1
> 2
> 3
> EOF
Звідки choose_script
це:
#!/bin/bash
{ read x; ./handle_$x.py; }
На жаль, я бачу деяке переплетення рядків - і багато нових рядків, яких там не повинно бути.
Наприклад, якщо я заміню свої скрипти Python на кілька простих скриптів bash, які роблять це:
#!/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;
Я бачу цей вихід:
1-8394
2-11238
2-22757
1-723
2-6669
3-3690
2-892
2-312511-24152
2-9317
3-5981
Це дратує - грунтуючись на витяжці чоловічої сторінки, яку я вставив вище, вона повинна підтримувати цілісність рядка.
Очевидно, що це працює, якщо я вилучу -u
аргумент, але тоді він буферизований, і мені не вистачить пам’яті, оскільки він буферизує вихід усіх, крім одного із сценаріїв.
Якщо хтось має деяке розуміння тут, це буде дуже вдячно. Я тут поза глибиною.
job1.py > file1 & job2.py > file 2 & job3.py > file3 ; wait ; sort -n file1 file2 file3
?
coproc
вбудований у bash, хоча я насправді не бачу, як це застосовується.