Как получить статус выхода из потока
Я пишу Perl-скрипт для получения статуса выхода каждого потока из родительского процесса. если я использую join(), я не могу получить правильный выход из потока.
Как захватить состояние выхода каждого потока из родительского процесса?
вот код
foreach (@threads) {
$_->join();
}
sub sub1 {
print "I am thread1\n";
exit(20);
}
sub sub2 {
print "I am thread2\n";
}
sub sub3 {
print "I am thread3\n";
}
sub sub4 {
print "I am thread4\n";
}
sub sub5 {
my $i=10/0;
print "$i\n";
print "I am thread5\n";
}
4 ответа
Сначала вы должны будете использовать threads->exit
как exit
выходит из всего процесса. Кроме того, вам придется die
вместо этого, внутри потока, чтобы сигнализировать об исключении для основного потока.
Основной поток может проверять наличие исключений до или после присоединения к потоку, используя
if (defined $thread->error) ..
От perldoc
$ Thr - > ошибка ()
Потоки выполняются в контексте eval. Этот метод возвращает undef, если поток завершается нормально. В противном случае он возвращает значение $@, связанное с состоянием выполнения потока в его eval-контексте.
Вы всегда можете сделать так, чтобы поток возвращал код состояния, а не вызывал exit()
, join()
позволяет получить возвращенный результат из подпрограммы, если вы запустили поток в подходящем контексте.
my $thr = threads -> create ( \&sub1 );
foreach my $thr ( threads -> list() )
{
my $result = $thr -> join();
print "Got result of $result from thread ", $thr -> tid(),"\n";
}
sub1 {
print "I am thread1";
return 20;
}
Может быть лучше просто вернуть значение, которое вы хотите вернуть. join
возвращает это значение.
my $thread = async { return "foo" };
say $thread->join(); # foo
Не используйте выход для отмены подпрограммы, если есть вероятность, что кто-то захочет перехватить любую ошибку. Вместо этого используйте die, который может быть пойман в ловушку eval. Функция exit() не всегда завершается немедленно. Сначала он вызывает любые определенные подпрограммы END, но эти подпрограммы END сами по себе не могут прервать выход.
Также см.: http://perldoc.perl.org/threads.html