Perl темы с тревогой - PullRequest
       1

Perl темы с тревогой

4 голосов
/ 13 июня 2011

Есть ли способ заставить сигнализацию (или другой механизм тайм-аута) работать в потоках perl (> = 5.012)?

1 Ответ

6 голосов
/ 13 июня 2011

Запустите alarm в вашем основном потоке с обработчиком сигналов, который сигнализирует вашим активным потокам.

use threads;
$t1 = threads->create( \&thread_that_might_hang );
$t2 = threads->create( \&thread_that_might_hang );
$SIG{ALRM} = sub {
    if ($t1->is_running) { $t1->kill('ALRM'); }
    if ($t2->is_running) { $t2->kill('ALRM'); }
};

alarm 60;
# $t1->join; $t2->join;
sleep 1 until $t1->is_joinable; $t1->join;
sleep 1 until $t2->is_joinable; $t2->join;
...

sub thread_that_might_hang {
    $SIG{ALRM} = sub { 
        print threads->self->tid(), " got SIGALRM. Good bye.\n";
        threads->exit(1);
    };
    ... do something that might hang ...
}

Если вам нужны разные сигналы тревоги для каждого потока, найдите модуль, который позволяет вам установить несколько сигналов тревоги, например Alarm::Concurrent.


Редактировать: комментаторы указывают на threads::join мешает SIGALRM, поэтому вам может потребоваться проверить $thr->is_joinable вместо вызова $thr->join

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