Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Perl多线程和foreach_Multithreading_Perl - Fatal编程技术网

Multithreading Perl多线程和foreach

Multithreading Perl多线程和foreach,multithreading,perl,Multithreading,Perl,我正在编写一个简单的Perl脚本,它应该同时运行其他Perl脚本。我不知道如何让主程序等待运行线程。由于许多原因,睡眠不是一个合适的解决办法。这是我的“主要”脚本: 如果我试着运行这个脚本,我能注意到的第一件事是打印是“连续的”,我认为文本是乱七八糟的,但可能打印是独占的,我不知道。主要问题是最后两个子例程没有时间执行 SSH DNS PING Perl exited with active threads: 2 running and unjoined 0 finished and unjoi

我正在编写一个简单的Perl脚本,它应该同时运行其他Perl脚本。我不知道如何让主程序等待运行线程。由于许多原因,睡眠不是一个合适的解决办法。这是我的“主要”脚本:

如果我试着运行这个脚本,我能注意到的第一件事是打印是“连续的”,我认为文本是乱七八糟的,但可能打印是独占的,我不知道。主要问题是最后两个子例程没有时间执行

SSH
DNS
PING
Perl exited with active threads:
2 running and unjoined
0 finished and unjoined
0 running and detached
如果我使用join而不是detach,子例程将变得“连续”,例如,如果我在sub-ssh中设置了睡眠,其他线程将在启动之前等待。我希望它们是并行的,主程序只有在所有线程都完成时才关闭,有什么帮助吗

实际上我还有一个问题,如果我必须在一个foreach循环中运行多个线程,那么我应该加入它们吗?ie:

my $thrssh;
foreach $mynode ($nodeset->get_nodelist) {
    #...
    $thrssh = threads ->create(\&ssh, $port, $hostname);
    #...
}
$thssh->join();

是这样吗?

您需要
在所有线程都已启动后,从主线程加入所有线程。如果不希望解释器在线程仍在运行时退出,请不要
detatch

...
my $thrssh = threads ->create(\&ssh, $hostname);
my $thrdns = threads ->create(\&dns, $hostname);
...
$thrssh->join();
$thrdns->join();
...
关于你的编辑:不,这不对。您需要保留对创建的每个线程的引用,否则无法加入它们

做一些类似于:

my @thrs;
foreach $mynode ($nodeset->get_nodelist) {
    #...
    $thrssh = threads ->create(\&ssh, $port, $hostname);
    push @thrs, $thrssh;
    #...
}
$_->join() for @thrs;
my @thrs;
foreach $mynode ($nodeset->get_nodelist) {
    #...
    $thrssh = threads ->create(\&ssh, $port, $hostname);
    push @thrs, $thrssh;
    #...
}
$_->join() for @thrs;