2010-03-11 3 views
60

Я хотел бы представить многопоточность в моем сценарии оболочки.Многопоточность в Bash

У меня есть сценарий, который вызывает функцию read_cfg() с различными аргументами. Каждый из этих вызовов функций является независимым.

Можно ли будет выполнять эти вызовы функций (а не скрипты) параллельно. Пожалуйста, позвольте мне, как мы можем достичь этого ...?

+0

Это не многопоточность - это многопроцессорная. Каждый экземпляр запускается в отдельном процессе, скопированном из оригинала с помощью 'fork()'. Эти процессы - в отличие от потоков - имеют собственные таблицы дескрипторов файлов, а их память - копирование на запись (поэтому, когда они меняют значение переменной, родительский процесс ее не видит). –

ответ

127

Конечно, просто добавьте & после команды:

read_cfg cfgA & 
read_cfg cfgB & 
read_cfg cfgC & 
wait 

все эти работы будет работать в фоновом режиме одновременно. Опциональная команда wait будет ждать завершения всех заданий.

Каждая команда будет работать в отдельном процессе, поэтому технически это не «многопоточность», но я считаю, что она решает вашу проблему.

+6

Вы должны прочитать разницу между процессом и потоком. То, что вы предлагаете, не является многопоточным - оно включает отдельные процессы для каждой команды. – TomTom

+24

@TomTom: Я, конечно, знаю разницу между процессами и потоками. Если вы видите через выбор слов OP, я считаю, что он просто спрашивает, можно ли параллельно запускать команды (что возможно). Я добавил примечание об этом, чтобы уточнить. – Martin

19

Управление заданиями Bash включает в себя несколько процессов, а не несколько потоков.

Вы можете выполнить команду в фоновом режиме с помощью суффикса &.

Вы можете дождаться завершения команды фона командой wait.

Вы можете выполнить несколько команд параллельно, разделив их на |. Это обеспечивает также механизм синхронизации, так как stdout команды слева от | подключен к команде stdin справа.

23

Вы можете запускать несколько копий своего скрипта параллельно, каждая копия для разных входных данных, например. обработать все * .cfg файлы на 4 ядра:

ls *.cfg | xargs -P 4 -n 1 read_cfg.sh 

Сценарий read_cfg.sh занимает всего один параметров (как предусмотрено -n)

+2

просто примечание о том, что вы должны указать полный путь к 'read_cfg.sh' или' xargs', скажет, что он не может найти файл. – Jeshurun

+0

Лучше использовать 'printf '% s \ 0' * .cfg | xargs -0 ... '- таким образом это работает с именами файлов с пробелами, непечатаемыми символами и т. д. См. также [Почему вы не должны анализировать вывод ls (1)] (http://mywiki.wooledge.org/ParsingLs). –

Смежные вопросы