Perl, Parallel::ForkManager - как реализовать тайм-аут для форка

Можно ли реализовать тайм-аут (лимит времени) для форка с помощью Parallel::ForkManager?

Базовый скрипт Parallel::ForkManager выглядит следующим образом

use Parallel::ForkManager;
my $pm = Parallel::ForkManager->new( 10 );
for ( 1 .. 1000 ) {
    $pm->start and next;
    # some job for fork
    $pm->finish;
}
$pm->wait_all_children();

Я хотел бы ограничить время для "# какой-то работы для форка". Например, если его не закончить за 90 секунд. то его (вилку) следует убить/завершить. Я думал о использовании этого , но должен сказать, что я не знаю, как использовать его с Parallel::ForkManager.

РЕДАКТИРОВАТЬ

Спасибо, Хоббс и Икегами. Оба ваших предложения сработали..... но только в этом базовом примере, а не в моем реальном сценарии :(. screenshot Эти вилки останутся там навсегда, и, честно говоря, я не знаю, почему. Пользуюсь этим скриптом пару месяцев. Ничего не менял (хотя многое зависит от внешних переменных). Каждый форк должен загрузить страницу с веб-сайта, проанализировать ее и сохранить результаты в файл. Это не должно занимать более 30 секунд на вилку. Время ожидания установлено на 180 секунд. Эти висящие вилки абсолютно случайны, поэтому очень сложно отследить проблему. Вот почему я придумал временное простое решение - тайм-аут и убийство.

Что может отключить (прервать) ваши методы тайм-аута в моем коде? У меня нет другого alarm()в моем коде.

РЕДАКТИРОВАТЬ 2

Одна из вилок зависла на 1 час 38 минут и вернула "timeout PID" - это то, что я набрал в die()для alarm(). Так что тайм-аут работает... но поздно примерно на 1ч36,5м ;). У вас есть идеи?

7
задан Community 23 May 2017 в 12:30
поделиться