Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > threads, eval, KILL


Автор: alezzz 11.9.2018, 16:42
Код

use threads 'exit' => 'threads_only';

my @ths;
my $max = 10;
$| = 1;

foreach my $num (1..$max) {
    push @ths, threads->create(
        sub {
            my $num = shift;
            
            $SIG{'KILL'} = sub {
                print "catch kill for thread $num\n";
                threads->exit;
            };
            
            print "thread $num started\n";
            while(1) {
                if ($num % 2 == 0) {
                    eval {
                        my $line = readline(STDIN);
                    };
                }
                else {
                    sleep 1;
                }
            }
        },
        $num
    );
}

sleep 3;

foreach my $num (1..$max) {
    print "send kill to $num\n";
    $ths[$num-1]->kill('KILL');
}

print "end, wait 3 sec\n\n";

sleep 3;


такой вывод получается:
Код

thread 1 started
thread 2 started
thread 3 started
thread 4 started
thread 5 started
thread 6 started
thread 7 started
thread 8 started
thread 9 started
thread 10 started
send kill to 1
send kill to 2
send kill to 3
send kill to 4
send kill to 5
send kill to 6
send kill to 7
send kill to 8
send kill to 9
send kill to 10
end, wait 3 sec

catch kill for thread 7
catch kill for thread 9
catch kill for thread 1
catch kill for thread 3
catch kill for thread 5
Perl exited with active threads:
        5 running and unjoined
        5 finished and unjoined
        0 running and detached


как завершать такие потоки с подвисшим ожиданием данных в eval?

Автор: alezzz 11.9.2018, 17:04
еще проверил, если без eval
Код

if ($num % 2 == 0) {
    my $line = readline(STDIN);
}

то результат такой-же

Автор: tishaishii 12.9.2018, 19:37
А вопрос?

Автор: alezzz 12.9.2018, 19:40
в конце первого поста, повторю:
как завершать такие потоки с подвисшим ожиданием получения данных?

Автор: tishaishii 13.9.2018, 15:36
Лучше бы разобраться с "подвисанием".
Есть функция alarm. И можно перехватывать сигналы.

Автор: alezzz 13.9.2018, 16:07
С подвисанием никак не разобраться, это эмуляция одного скрипта принимающего udp. Можно решить через IO::Select, но тогда ресурсов cpu уходит почти в 2 раза больше.

alarm пробовал, но что-то не получилось, приму в дар мой пример с рабочим алармом  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)