Я довольно новичок в потоках Perl, поэтому я хотел бы знать правильный способ сделать это в Perl:
for $input (@inputs) {
push @threads, start_thread($input);
}
for $thread (@threads) {
wait_for_external_event();
$thread->kick_thread_out_of_loop();
$result = $thread->result();
print $result;
}
sub my_thread {
my $input = shift;
while(1) {
my $result = compute($best_result_so_far,$input);
if($result > $best_result_so_far) {
$best_result_so_far = $result;
}
}
# The thread got kicked out of the loop
return $best_result_so_far;
do_some_cleanup_that_is_slow();
exit thread;
}
У меня такое чувство, что способ выкинуть поток из цикла вычисленийиспользуя сигналы и обработчик сигналов в потоке.Но, возможно, есть даже более красивые способы сделать это.Мне нужна помощь в том, как именно это реализовать, и особенно в том, как я могу вернуть $ best_result_so_far и после возврата выполнить медленную очистку.Очень важно, чтобы мне не пришлось ждать очистки, прежде чем я смогу получить результат.
--- edit ---
Я посмотрел учебник, и яне удалось найти примеры общения с запущенными потоками («объединение» только умирает потоками).Могу ли я получить результат обратно из запущенного потока, например:
for $input (@inputs) {
push @threads, start_thread($input);
}
for $thread (@threads) {
wait_for_external_event();
$result = $thread->result();
$thread->kill("KILL");
print $result;
}
package ThreadObj;
sub my_thread {
my $self = shift;
my $input = shift;
local $SIG{KILL} = sub {
do_slow_cleanup();
threads->exit();
};
while(1) {
my $result = compute($best_result_so_far,$input);
if($result > $self->{'best_result_so_far'}) {
$self->{'best_result_so_far'} = $result;
}
}
}
sub result {
my $self = shift;
wait until (defined $self->{'best_result_so_far'});
return $self->{'best_result_so_far'};
}