Использование async
для темы в Perl сценарий мне нужно сделать некоторую параллельную функциональность, однако я должен установить лимит времени для исправления таких нитей (например, не более 5 сек). Мне нужно убить все запущенные потоки, если они работают дольше, но все равно сохранить программу в активном состоянии. Мой код:Как убить запущенные потоки и сохранить приложение perl в живых?
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";
Есть ли лучший способ, как убить запущенные потоки и сохранить приложение в живых?
Наверняка есть лучший способ отслеживать пять секунд, чем ожидание. – sarnold
Но вы жуете хотя бы одно ядро до смерти, ничего не делая, кроме проверки времени. Это дорого и тепло, и мощность. Я сделал комментарий в надежде, что кто-то, кто знает Perl лучше, чем я, заметят мой комментарий и дадут совет по замене его более эффективным кодом - что-то, что они могли пропустить, если они просто ответят на ваш вопрос напрямую. – sarnold
@sarnold - я понимаю, но до сих пор кто-то еще утверждает, что ожидание не так, и никто не пришел с альтернативным решением. Что еще вы можете сделать, если вам нужно подождать? –