Perl умирает (и останавливает всю программу) в потоке

У меня есть сценарий Perl, который порождает группу рабочих потоков. Когда один из этих потоков обнаруживает фатальную ошибку, я бы хотел, чтобы сценарий ВЕСЬ умер и напечатал сообщение об ошибке.

Проблема в том, что ... когда вы используете die в потоке, он только завершит текущий поток с сообщением типа Thread 42 terminated abnormally: blah blah blah..., а остальная часть скрипта продолжит работу.


Пример:

use strict;
use warnings;
use threads;

# Create threads
for my $i (1 .. 5) {
    threads->create(\&do_something, $i);
}

# Wait for all threads to complete
$_->join() for threads->list();

sub do_something {
    my $i = shift;
    die "I'm died" if $i == 3;
}

Вывод:

Поток 3 завершился ненормально: я умер на строке 15


Как я могу сделать фатальную ошибку в потоке, убить весь скрипт?


person tjwrona1992    schedule 08.10.2015    source источник


Ответы (1)


Согласно потокам perldoc:

Вызов exit EXPR внутри потока приводит к завершению работы всего приложения. Из-за этого использование exit() внутри многопоточного кода или в модулях, которые могут использоваться в многопоточных приложениях, настоятельно не рекомендуется.

Если exit() действительно требуется, рассмотрите возможность использования следующего:

threads->exit() if threads->can('exit');   # Thread friendly
exit(status);
person Matt Jacob    schedule 08.10.2015
comment
просто вызов exit работает, но выводит уродливую программу, завершенную с ошибкой запущенных потоков. Есть ли способ убить все потоки и выйти чисто? - person tjwrona1992; 09.10.2015