【发布时间】: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