1

我正在开发一个脚本来对用多种语言(Perl、Java、R)编写的程序进行基准测试和比较,这些程序设计用于相同的目的。我需要同时运行两个子程序,一个用于使用 Unix TOP 命令,另一个用于执行程序。我正在尝试使用 Parallel::ForkManager。这是我用来分叉的代码:

sub parallelRun{

$commands[0]= sub{topExec};
$commands[1]= sub{masExec};

my $manager = new Parallel::ForkManager( 2 );

for($i=0; $i <= $#commands; $i++) {

        $pid = $manager-> start and next;
        push(@pid,$pid);
        $commands[$i]();
        $manager-> finish;

    } # For End

    $manager->wait_all_children;
    $manager-> finish($pid[0]);
    undef(@pid);

} # Sub End

完成后我需要完成topExec()(TOP 执行)masExec(),但是脚本在 TOP 命令之后挂起。

奖励问题:有没有办法让执行的程序的系统 pidmasExec()在 TOP 命令中跟踪它?现在,我正在从 Unix Top 命令(sub topExec)中的用户和命令列进行跟踪。

抱歉有任何语言错误(两者都不是本地语言;))。

4

1 回答 1

2

kill(TERM => $pid[0]);


顺便说一句,我不明白你为什么在这里使用 P::FM。你甚至不需要创建两个孩子。

use POSIX qw( _exit );

sub parallelRun {
    my $pid = fork();
    die if !defined($pid);

    if (!$pid) {
       topExec();
       _exit(0);
    }

    masExec();
    kill(TERM => $pid);
    waitpid($pid, 0);
 }

一些 Perl 技巧:

始终使用use strict; use warnings;. 对于初学者,您有许多未声明的变量。

  1. $commands[0]= sub{topExec};
    $commands[1]= sub{masExec};
    

    应该

    my @commands = ( \&topExec, \&masExec );
    

    (声明数组,不要创建不必要的匿名子。)

  2. for(my $i=0; $i <= $#commands; $i++) {
        ... $commands[$i] ...
    

    应该更简单

    for my $i (0..$#commands) {
        ... $commands[$i] ...
    

    甚至

    for my $command (@commands) {
        ... $command ...
    
  3. undef(@pid);
    

    完全不需要。这是没有正确声明的症状@pid

于 2013-05-29T04:27:05.823 回答