【问题标题】:Perl multithreading and foreachPerl 多线程和 foreach
【发布时间】:2011-12-28 11:42:32
【问题描述】:

我正在编写一个简单的 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 而不是 detach,则子例程将变为“顺序”,例如,如果我在 sub ssh 中设置睡眠,其他线程将在启动前等待。我希望它们是并行的,并且只有在所有线程完成后才关闭主程序,有什么帮助吗?

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

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

是吗?

【问题讨论】:

    标签: multithreading perl


    【解决方案1】:

    你需要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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多