我是一名航空航天工程专业的学生,我正在进行一项高级顶级项目.我正在开发的一个数学模型需要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.