微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Perl多线程和foreach

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

#!/usr/bin/perl
use threads;
main:
{
    if ($#ARGV == -1) { usage(); exit(1); }
    my $hostname = $ARGV[0];
    my $thRSSh = threads ->create(\&ssh,$hostname);
    my $thrdns = threads ->create(\&dns,$hostname);
    my $thrping = threads ->create(\&ping,$hostname);
    my $thrsmtp = threads ->create(\&smtp,$hostname);
    my $thrproxy = threads ->create(\&proxy,$hostname);
}
sub ssh {
    threads->detach();
    my $hostname = @_;
    #print "SSH\n";
    #LAUNCH SSH SCRIPT
}
#OTHER SUbroUTInes...
sub proxy {
    threads->detach();
    my $hostname = @_;
    #print "PROXY\n";
    #LAUNCH PROXY SCRIPT
}

如果我尝试运行这个脚本,我可以注意到的第一件事是打印是“顺序的”,我认为文本搞砸了,但也许打印是独家我不知道.主要问题是最后两个子程序没有时间执行.

SSH
DNS
PING
Perl exited with active threads:
2 running and unjoined
0 finished and unjoined
0 running and detached

如果我使用join而不是分离,则子例程变为“顺序”,例如,如果我在子ssh中进行休眠,则其他线程将在启动之前等待.我希望它们是并行的,主程序只在所有线程完成后关闭,任何帮助?

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

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

是对的吗?

解决方法

在完成所有线程之后,您需要从主线程加入所有线程.如果您不希望在线程仍在运行时退出解释器,请不要分离.

...
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,$hostname);
    push @thrs,$thRSSh;
    #...
}
$_->join() for @thrs;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐