Технически, да, так как Darwin является существенно тем же низом живота UNIX, который находится в Mac OS X.
Во всей практичности, не, если Вы не в Apple. Даже если бы Вы взяли pkg файлы из установщика OS X, то они, вероятно, не были бы устанавливаемыми непосредственно на Darwin. Я не был бы удивлен вообще, если Вода требует компонентов, которые не доступны как часть Darwin (как Dont Steal Mac OS X.kext
). Но если бы у Вас есть копия Mac OS X, это был бы забавный проект попытаться получить Воду, работающую на нем. Вы, вероятно, узнаете больше, чем Вы когда-нибудь хотели приблизительно он.
Официально GUI для Darwin X, точно так же, как с любым UNIX.
Попытайтесь использовать-u опцию параллели GNU.
echo "1\n2\n3" | parallel -u -IX ./handle_X.sh
Это выполняет их параллельно, не буферизуя полноту никакого процесса.
Возможно, я пропускаю что-то, но не можете Вы просто сделать:
(./handle_1.py & ./handle_2.py & ./handle_3.py) | sort -n
Если Вы хотите, чтобы строки от каждого процесса не были чередованы, более легкое должно, вероятно, удостовериться, что процесс сами пишет им полностью и возможно отключает вывод, буферизующий как write
s к каналу, как гарантируют, будут атомарными, пока они не больше, чем PIPE_BUF
. Например, Вы могли удостовериться, что это действительно использует вывод, буферизующий а-ля stdio
и звоните fflush
или независимо от того, что эквивалент находится в python
после того, как одна или несколько строк были записаны.
Если Вы не можете изменить сценарии Python, Вы могли бы сделать:
lb() { grep --line-buffered '^'; }
(с GNU grep) или:
lb() while IFS= read -r l; do printf '%s\n' "$l"; done
(См. примечания в комментариях ниже если, что вывод команд не является текстом),
И сделайте:
(./handle_1.py | lb & ./handle_2.py | lb & ./handle_3.py | lb) | sort -n
Другая опция избежать тех 3 lb
процессы должны иметь три канала к одной команде, которая использует select
/poll
видеть, где существует некоторый вывод, прибывающий из, и подает его к sort
основанный на строке, но требуется немного программирования.
sort -n
останется, пока все программы, которые имеют fd, открытый на нем, не вышли.
– Stéphane Chazelas
25.10.2012, 20:51
Попытка:
parallel ::: ./handle_1.py ./handle_2.py ./handle_3.py
Если handle_1.py
берет имя файла:
parallel ::: ./handle_1.py ./handle_2.py ./handle_3.py ::: files*
Вы не хотите смешанного вывода, не используйте-u.
Если Вы хотите сохранить порядок (таким образом, весь вывод handle_1, прежде handle_2 и таким образом Вы смогли стараться не сортировать):
parallel -k ::: ./handle_1.py ./handle_2.py ./handle_3.py ::: files*
Если Вы все еще хотите отсортированный, можно параллелизировать вид и использовать sort -m
:
parallel --files "./handle_{1}.py {2} | sort -n" ::: 1 2 3 ::: files* | parallel -j1 -X sort -m
$TMPDIR набора к dir, который является достаточно большим для содержания вывода.
Ответ Flowbok был правильным решением. Странно, вывод GNU parallel
искажается, если это производится непосредственно в файл - но не, если это переходит к tty.
К счастью, script -c
доступно для имитации tty.
Существует все еще эти три сценария:
#!/bin/bash
# handle_1.sh
while true; do echo "1-$RANDOM$RANDOM$RANDOM$RANDOM"; done
.
#!/bin/bash
# handle_2.sh
while true; do echo "2-$RANDOM$RANDOM$RANDOM$RANDOM"; done
.
#!/bin/bash
# handle_3.sh
while true; do echo "3-$RANDOM$RANDOM$RANDOM$RANDOM"; done
Затем существует файл, который инкапсулирует вызов, чтобы быть параллельным:
#!/bin/bash
# run_parallel.sh
parallel -u -I N ./handle_N.sh ::: "1" "2" "3"
И затем я называю его как это:
script -c ./run_parallel > output
Строки в выводе смешаны линию за линией между выводом различных сценариев, но они не становятся искаженными или чередованными на данной строке.
Причудливое поведение от parallel
- Я могу зарегистрировать отчет об ошибках.
X
вIX
сообщение-I
то, что X будет флаг для замены или это применяющийся-X
флаг, который по-видимому также имеет соответствующее значение? – Cera 25.10.2012, 09:35parallel -u -X ./handle_{}.sh ::: "1" "2" "3"
, и к сожалению я все еще вижу, что некоторый вывод искажает. – Cera 25.10.2012, 09:43parallel -u ./handle_{}.sh
, но я предпочитаю изменять его, так как фигурные скобки также имеют значение объединяющихся команд (как в Вашем вопросе). – flowblok 25.10.2012, 09:43