我正在使用从XFOIL生成的数据建立数学模型,XFOIL是一种流行的航空工具,用于查找机翼的升力和阻力系数。

我有一个Perl脚本,该脚本使用不同的输入参数反复调用XFOIL以生成所需的数据。我需要XFOIL运行5600次,每次运行大约100秒,大约需要6.5天才能完成。

我有一台四核计算机,但是我作为程序员的经验有限,而且我实际上只知道如何使用基本的Perl。

我想一次在自己的内核上运行四个XFOIL实例。像这样:

while ( 1 ) {

    for ( i = 1..4 ) {

        if ( ! exists XFOIL_instance(i) ) {

            start_new_XFOIL_instance(i, input_parameter_list);
        }
    }
}


因此,当我们可以使用新的输入参数列表启动新实例时,程序将一直检查(或最好是休眠)直到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。

关于perl - 如何使我的Perl脚本对子进程使用多个内核?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1961682/

10-10 11:15