如何使用Perl的系统调用来生成独立线程?

时间:2009-09-04 17:18:13

标签: perl multithreading

我想调用其他Perl脚本,以便使用主Perl脚本执行争用测试。

这样的东西目前有效:

system("perl 1.pl");
system("perl 2.pl");
exit;

但是,我想把它们作为独立线程同时运行。

根据我的Google搜索,我尝试过这样的事情:

system(1, "perl 1.pl");
system(1, "perl 2.pl");
exit;

这不起作用。主脚本立即存在,这很好,但我想要生成的底层线程不会被启动。我想知道是否还有其他事情要做,或者是否有其他人做过这样的事情。

感谢您提前提供任何帮助。

4 个答案:

答案 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

另请参阅:$^Xwaitpid

答案 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 - 为线程提供更整洁的界面,这应该完全符合您的预期;)