Perl или скрипт Bash Threadpool? - PullRequest
7 голосов
/ 05 июля 2011

У меня есть скрипт - линейный список команд - который занимает много времени для последовательной работы.Я хотел бы создать служебный скрипт (Perl, Bash или другой, доступный на Cygwin), который может читать команды из любого линейного скрипта и выводить их на настраиваемое количество параллельных рабочих.

Так что если myscript - это

command1
command2
command3

Я могу запустить:

threadpool -n 2 myscript

Будет создано два потока: один начинается с command1, а другой command2.Независимо от того, какой поток завершит свою первую работу, сначала запустится command3.

Прежде чем погрузиться в Perl (это было давно), я подумал, что должен спросить экспертов, если что-то подобное уже существует.Я уверен, что должно быть что-то подобное, потому что это было бы невероятно полезно как для эксплуатации многопроцессорных машин, так и для параллельных сетевых передач (wget или scp).Я думаю, я не знаю правильных условий поиска.Спасибо!

Ответы [ 5 ]

4 голосов
/ 16 мая 2015

Если вам нужно, чтобы вывод не был перепутан (что xargs -P рискует), вы можете использовать GNU Parallel:

parallel -j2 ::: command1 command2 command3

Или, если команды находятся в файле:

cat file | parallel -j2

GNU Parallel - это общий параллелизатор, который позволяет легко запускать задания параллельно на одной и той же машине или на нескольких машинах, к которым у вас есть доступ по ssh.

Если у вас есть 32 разных задания, которые вы хотите выполнитьзапустить на 4 процессорах, прямой способ распараллеливания - запустить 8 заданий на каждом процессоре:

Simple scheduling

GNU Parallel вместо этого порождает новый процесс после его завершения - поддерживая активные процессорыи, следовательно, экономия времени:

GNU Parallel scheduling

Установка

Если GNU Parallel не упакован для вашего дистрибутива, вы можете выполнить личную установку,который не требует корневого доступа.Это можно сделать за 10 секунд, выполнив следующее:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Другие варианты установки см. http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Подробнее

Подробнеепримеры: http://www.gnu.org/software/parallel/man.html

Посмотрите вступительные видеоролики: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Просмотрите учебное пособие: http://www.gnu.org/software/parallel/parallel_tutorial.html

Подпишитесь на рассылку, чтобы получить поддержку: https://lists.gnu.org/mailman/listinfo/parallel

3 голосов
/ 05 июля 2011

В Perl вы можете сделать это с помощью Parallel :: ForkManager :

#!/usr/bin/perl

use strict;
use warnings;
use Parallel::ForkManager;
my $pm = Parallel::ForkManager->new( 8 ); # number of jobs to run in parallel

open FILE, "<commands.txt" or die $!;
while ( my $cmd = <FILE> ) {
    $pm->start and next;
    system( $cmd );
    $pm->finish;
}
close FILE or die $!;

$pm->wait_all_children;
1 голос
/ 05 июля 2011

Существует xjobs, который лучше разделяет выходные данные отдельных заданий, чем xargs -P.

http://www.maier -komor.de / xjobs.html

0 голосов
/ 23 августа 2016

Источник: http://coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/7

# That's commands.txt file
echo Hello world
echo Goodbye world
echo Goodbye cruel world

cat commands.txt |xargs -I CMD --max-procs = 3 bash -c CMD

0 голосов
/ 05 июля 2011

Вы также можете использовать make . Здесь очень интересная статья о том, как использовать его творчески

...