如何使我的Perl脚本为子进程使用多个内核?

前端之家收集整理的这篇文章主要介绍了如何使我的Perl脚本为子进程使用多个内核?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是一名航空航天工程专业的学生,​​我正在进行一项高级顶级项目.我正在开发的一个数学模型需要XFOIL的一个天文数量生成数据,XFOIL是用于找到翼型上的升力和阻力系数的流行航空工具. (但我是离题的)

切到追逐:我有一个Perl脚本,使用不同的输入参数重复调用XFOIL来生成我需要的数据.我需要XFOIL运行5600次,现在平均每次运行大约需要100秒.做数学,这意味着需要大约6.5天才能完成.

现在,我有一台四核机器,但作为程序员的经验是有限的,我真的只知道如何使用基本的Perl.我想一次运行4个XFOIL的实例,全部在自己的核心上.这样的事情

while (1){
    for (i = 1..4){
        if (! exists XFOIL_instance(i)){
            start_new_XFOIL_instance(i,input_parameter_list);
        }
    }
}

因此,如果每个核心都运行XFOIL,程序正在检查(或者最好是休眠,直到XFOIL实例唤醒以启动新的实例).如果没有,先前的实例退出,我们可以使用新的输入参数列表启动一个新的实例.

如果任何人有任何想法如何实现,请让我知道.这将大大加快我需要生成数据的时间,并让我在航空航天项目本身工作.

谢谢您的帮助!

解决方法

尝试 Parallel::ForkManager.它是一个模块,提供了一个简单的界面来解析这样的进程.

以下是一些示例代码

#!/usr/bin/perl

use strict;
use warnings;
use Parallel::ForkManager;

my @input_parameter_list = 
    map { join '_',('param',$_) }
    ( 1 .. 15 );

my $n_processes = 4;
my $pm = Parallel::ForkManager->new( $n_processes );
for my $i ( 1 .. $n_processes ) {
    $pm->start and next;

    my $count = 0;
    foreach my $param_set (@input_parameter_list) {         
        $count++;
        if ( ( $count % $i ) == 0 ) {
            if ( !output_exists($param_set) ) {
                start_new_XFOIL_instance($param_set);
            }
        }
    }

    $pm->finish;
}
$pm->wait_all_children;

sub output_exists {
    my $param_set = shift;
    return ( -f "$param_set.out" );
}

sub start_new_XFOIL_instance {
    my $param_set = shift;
    print "starting XFOIL instance with parameters $param_set!\n";
    sleep( 5 );
    touch( "$param_set.out" );
    print "finished run with parameters $param_set!\n";
}

sub touch {
    my $fn = shift;
    open FILE,">$fn" or die $!;
    close FILE or die $!;
}

您将需要为start_new_XFOIL_instance和output_exists函数提供自己的实现,您还需要定义自己的参数集,以传递给XFOIL.

原文链接:https://www.f2er.com/Perl/172705.html

猜你在找的Perl相关文章