Создание единственного потока вывода из трех других потоков, произведенных параллельно

Технически, да, так как Darwin является существенно тем же низом живота UNIX, который находится в Mac OS X.

Во всей практичности, не, если Вы не в Apple. Даже если бы Вы взяли pkg файлы из установщика OS X, то они, вероятно, не были бы устанавливаемыми непосредственно на Darwin. Я не был бы удивлен вообще, если Вода требует компонентов, которые не доступны как часть Darwin (как Dont Steal Mac OS X.kext). Но если бы у Вас есть копия Mac OS X, это был бы забавный проект попытаться получить Воду, работающую на нем. Вы, вероятно, узнаете больше, чем Вы когда-нибудь хотели приблизительно он.

Официально GUI для Darwin X, точно так же, как с любым UNIX.

10
13.09.2017, 14:00
4 ответа

Попытайтесь использовать-u опцию параллели GNU.

echo "1\n2\n3" | parallel -u -IX ./handle_X.sh

Это выполняет их параллельно, не буферизуя полноту никакого процесса.

2
27.01.2020, 20:03
  • 1
    , я немного смущен - X в IX сообщение -I то, что X будет флаг для замены или это применяющийся -X флаг, который по-видимому также имеет соответствующее значение? –  Cera 25.10.2012, 09:35
  • 2
    Hmph. Я делаю это: parallel -u -X ./handle_{}.sh ::: "1" "2" "3", и к сожалению я все еще вижу, что некоторый вывод искажает. –  Cera 25.10.2012, 09:43
  • 3
    первый: можно также использовать parallel -u ./handle_{}.sh, но я предпочитаю изменять его, так как фигурные скобки также имеют значение объединяющихся команд (как в Вашем вопросе). –  flowblok 25.10.2012, 09:43
  • 4
    Кажется, работает на меня, мой grep не берет искажения: pastie.org/5113187 (Вы используете тестовые сценарии удара или Ваши фактические сценарии Python?) –  flowblok 25.10.2012, 09:49
  • 5
    Проблема состоит в том, что это ничего на самом деле не делает параллельно. Я использую сценарии удара - pastie.org/5113225 –  Cera 25.10.2012, 10:01

Возможно, я пропускаю что-то, но не можете Вы просто сделать:

(./handle_1.py & ./handle_2.py & ./handle_3.py) | sort -n

Если Вы хотите, чтобы строки от каждого процесса не были чередованы, более легкое должно, вероятно, удостовериться, что процесс сами пишет им полностью и возможно отключает вывод, буферизующий как writes к каналу, как гарантируют, будут атомарными, пока они не больше, чем 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 основанный на строке, но требуется немного программирования.

2
27.01.2020, 20:03
  • 1
    Вам нужен a wait там, я думаю. –  derobert 25.10.2012, 20:44
  • 2
    Нет, если некоторые программы близко их stdout перед выходом, потому что канал и sort -n останется, пока все программы, которые имеют fd, открытый на нем, не вышли. –  Stéphane Chazelas 25.10.2012, 20:51
  • 3
    Действительно, я протестировал, Вы корректны. –  derobert 25.10.2012, 22:31
  • 4
    Нет, я все еще получаю искаженный вывод. Строки смешаны и чередовали. –  Cera 26.10.2012, 01:16
  • 5
    OK @Cerales, см. мой обновленный ответ –  Stéphane Chazelas 26.10.2012, 09:13

Попытка:

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, который является достаточно большим для содержания вывода.

2
27.01.2020, 20:03
  • 1
    я действительно хочу 'смешанный' вывод - я просто, хочет удостовериться, что каждая строка в окончательном результате является одной строкой от одного из подпроцессов. Если я не смешаю его, то система исчерпает память, буферизующую stdout потоки, которые еще не распечатываются. –  Cera 26.10.2012, 01:13
  • 2
    С Параллелью GNU у Вас не закончится память: Это не буферизует в памяти. Почему Вы думаете, что это буферизует в памяти? –  Ole Tange 27.10.2012, 09:58

Ответ 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 - Я могу зарегистрировать отчет об ошибках.

1
27.01.2020, 20:03

Теги

Похожие вопросы