我如何杀死Perl线程?

bag*_*man 2 perl multithreading fork

在这个程序中,我创建一个fork,然后从它调用domultithreading.然后它创建一些线程.

sub domultithreading {
    #Not my function
    my ($num) = @_;
    my @thrs;
    my $i = 0;
    my $connectionsperthread = 50;
    while ( $i < $num ) {
        $thrs[$i] = threads->create( \&doconnections, $connectionsperthread, 1 );
        $i += $connectionsperthread;
    }
    my @threadslist = threads->list();
    while ( $#threadslist > 0 ) {
        $failed = 0;
    }
}

sub kill {
    #how can I kill the threads made in domultithreading?
    kill 9, $pid;
    print "\nkilling $pid\n";
}
Run Code Online (Sandbox Code Playgroud)

然后我希望能够杀死fork及其线程,但是我无法理解它.有什么建议?

非常感谢

amo*_*mon 5

Perl提供了两种并发模型:进程和线程.虽然你不应该在没有充分理由的情况下将这两者混合在一起,但是线程会非常密切地建模过程,因此我们几乎可以对它们进行处理.具体来说,我们可以向线程发送信号.

可以使用以下kill 函数发出进程信号:kill SIGNAL => $pid,可以使用以下kill 方法发出线程信号:$thr->kill(SIGNAL).此方法返回线程对象.在%SIG散列中设置信号处理程序时可以截取信号.

这意味着每个进程TERM信号处理程序TERM都是所有子线程的

 $_->kill(9)->join() for threads->list;
Run Code Online (Sandbox Code Playgroud)

并且每个线程TERM信号处理程序只是退出线程,或者清理:

 threads->exit; # exit the current thread
Run Code Online (Sandbox Code Playgroud)