Как убить запущенные потоки и сохранить приложение Perl живым? - PullRequest
2 голосов
/ 02 марта 2012

Использование async для потоков в сценарии perl Мне нужно выполнить некоторые параллельные функции, однако я должен установить фиксированный лимит времени для таких потоков (например, максимум 5 секунд) , Мне нужно убить все запущенные потоки, если они работают дольше, но все же поддерживать программу в рабочем состоянии . Мой код:

use threads ( 'yield',
              'exit' => 'threads_only',
              'stack_size' => 2*16384 );
use threads::shared;
use Time::HiRes qw/sleep/;

...

$start = [Time::HiRes::gettimeofday()];
my $running :shared = 0;
foreach ($entry) {
  async(
    sub {
           local $SIG{KILL} = sub { threads->exit };
           { lock $running; ++$running };

           ...

           { lock $running; --$running };
        },
  $_)->detach;
}

while ($running) {
  sleep 0.005;
  last if (Time::HiRes::tv_interval($start) > 5);
}

if ($running) {
  my @running = threads->list(threads::running);
  foreach (@running) {
    $_->kill('KILL')->detach;
  }
}

print "I am still alive\n";

Есть ли какой-нибудь лучший способ, как убить работающие потоки и сохранить приложение живым?

Ответы [ 2 ]

5 голосов
/ 02 марта 2012

Не делай так. Кодируйте потоки так, чтобы они выполняли только ту работу, которую вы хотите выполнить, и завершайте сами, когда для них нет работы. Не пытайтесь войти снаружи и убить их. Это никогда не работает хорошо.

1 голос
/ 02 марта 2012

async возвращает объект потока, который вы можете вызвать kill. Просто поместите их в массив и затем убейте их.

http://perldoc.perl.org/threads.html

Лучшим вариантом, вероятно, было бы то, чтобы потоки убивали себя через это время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...