我想调用其他Perl脚本,以便使用主Perl脚本执行争用测试。
这样的东西目前有效:
system("perl 1.pl");
system("perl 2.pl");
exit;
但是,我想把它们作为独立线程同时运行。
根据我的Google搜索,我尝试过这样的事情:
system(1, "perl 1.pl");
system(1, "perl 2.pl");
exit;
这不起作用。主脚本立即存在,这很好,但我想要生成的底层线程不会被启动。我想知道是否还有其他事情要做,或者是否有其他人做过这样的事情。
感谢您提前提供任何帮助。
答案 0 :(得分:13)
use threads;
$thr1 = threads->create('msc', 'perl 1.pl');
$thr2 = threads->create('msc', 'perl 2.pl');
$thr1->join();
$thr2->join();
sub msc{ ## make system call
system( @_ );
}
这将等待它们退出之前完成执行。我猜这是你想要的原始问题,对吗?如果没有随意发表评论并编辑你的帖子以便更好地解释它,我会再试一次。
答案 1 :(得分:4)
您可以fork
关闭进程以便为您运行命令。如果您这样做,您可能希望使用exec
代替system
:
#!/usr/bin/perl
use strict;
use warnings;
die "could not fork: $!" unless defined (my $first_pid = fork);
#first child
exec $^X, "1.pl" unless $first_pid;
die "could not fork: $!" unless defined (my $second_pid = fork);
#second child
exec $^X, "2.pl" unless $second_pid;
waitpid $first_pid, 0; #wait for first child to finish
waitpid $second_pid, 0; #wait for second child to finish
答案 2 :(得分:3)
使用fork命令执行此操作,或者从shell脚本执行此操作。 shell脚本(仅限unix)类似于:
nohup perl 1.pl &
nohup perl 2.pl &
exit
perl命令看起来像:
if ( ! fork() )
{
system("perl 1.pl");
}
if ( ! fork() )
{
system("perl 2.pl");
}
有更好的方法可以做到这一点,这意味着使用perl在一个脚本中编写争用,但这将有效。确保在父脚本中添加了带有wait()的SIG_CHLD函数。您可以在此处找到有关此类事件处理的更多信息。系统(“perl 1.pl&”);可能有用(我还没有测试过),我认为分叉和等待是一种非常有价值的资源,更不用说了。
答案 3 :(得分:2)
在CPAN上查看Parallel::ForkManager - 为线程提供更整洁的界面,这应该完全符合您的预期;)