Perl - ответственный за разветвление - PullRequest
6 голосов
/ 09 февраля 2012

Я недавно обнаружил, что Perl разветвляется, и я совершенно влюблен.Но одна вещь касается меня - если я просто разделяю процессы влево и вправо, это, безусловно, вызовет какую-то проблему.Есть ли разумная проверка, которую следует использовать, чтобы убедиться, что мое маленькое приложение не поглощает все ресурсы моей машины?

Возьмите этот пример кода:

foreach my $command (@commands) {
   my $pid = fork();
   if (!$defined $pid) {
     #Fork failed. Do something.
   } elsif ($pid == 0) { #This is the child.
      system($command);
      exit(0)
   }
}

while (wait() != -1) {} #wait() will be -1 when the last child exits.

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

Что если у меня вдруг будет более 5000 команд для выполнения?Было бы неразумно отключать столько процессов.Так какой тип проверки должен быть реализован и как?

)

Ответы [ 4 ]

7 голосов
/ 09 февраля 2012

Также, если вас беспокоит одновременное создание слишком большого числа разветвленных процессов, вы можете ограничить их.

Либо бросьте свои собственные (используя очередь для удержания "для разветвления"), либо еще лучше, используйте модуль Parallel::ForkManager, который позволяет ограничивать одновременные разветвления с помощью параметра конструктора.

use Parallel::ForkManager;
$pm = new Parallel::ForkManager($MAX_PROCESSES);

Обратите внимание, что ForkManager ТАКЖЕ позаботится о том, чтобы получать завершенные дочерние процессы через вас.предоставляемые API "wait *"

3 голосов
/ 09 февраля 2012

Когда ребенок выходит, он отправляет обратно SIG_CHLD родителю.Вы захотите пожать их, как если бы вы этого не делали, они будут зомби в таблице процессов до последнего вызова wait в конце вашего сценария.

Глава 16 книги Perl Cookbook О'Рейли о книгах Google содержит информацию об этом.По сути, вам нужно увеличивать счетчик, когда вы разветвляете детей, и уменьшать его, когда вы пожинаете их, а не разветвлять новые, превышающие разумный максимум работающих детей.разумный максимум "это ... зависит от оборудования и от того, что делают эти разветвленные процессы.На этот вопрос нет статического ответа, кроме как сказать «проверь, что ты делаешь», и посмотри, как влияет производительность на машину.Желательно в рабочее время.После сисадмина, что вы делаете.У него / нее может даже быть какой-то совет.

1 голос
/ 09 февраля 2012

Чтобы убедиться, что вы не запускаете больше процессов, чем то, что система может эффективно обрабатывать, вы можете использовать такие модули, как Parallel :: ForkManager

0 голосов
/ 09 февраля 2012

Порождение (разветвление) всех процессов, которые может поддерживать ваша система, называется fork bomb . Ваша система может зависнуть или зависнуть, так как ее таблица процессов становится насыщенной, а память и процессор истощаются. В системах Linux команда ulimit должна отображать максимально допустимое количество пользовательских процессов. Вы можете (должны) установить это соответствующим образом для вашей системы. Форкинг создает процессы в геометрической прогрессии. Таким образом, этот фрагмент создает четыре процесса, которые бесконечно потребляют ресурсы процессора до тех пор, пока не будут уничтожены - противная крошечная бомба:

perl -e 'fork; fork; 1 while {}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...