微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使我的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.jb51.cc/Perl/172705.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐