如何让我的 Perl 脚本对子进程使用多个核心?

2024-01-14

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

我有一个 Perl 脚本,它使用不同的输入参数重复调用 XFOIL 以生成我需要的数据。我需要 XFOIL 运行 5,600 次,每次运行大约 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 实例空闲,此时我们可以使用新的输入参数列表启动新实例。


Try 并行::ForkManager http://search.cpan.org/~dlux/Parallel-ForkManager-0.7.5/ForkManager.pm。它是一个模块,提供了一个简单的接口来分叉这样的进程。

这是一些示例代码:

#!/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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让我的 Perl 脚本对子进程使用多个核心? 的相关文章

  • Bash - 在 perl 正则表达式中使用变量以及匹配组

    这是我在 stackoverflow 上的第一篇文章 如果我错过了一些重要的内容 请原谅我 我目前遇到以下问题 目标是根据我准备的文件列表动态替换端口号find 这些文件中的所有端口均以数字 4 开头 有 5 位数字 现在是棘手的部分 我只
  • 如何在 BEGIN 块之外正确声明哈希?

    考虑这个简单的程序 您能解释一下为什么在取消注释前两行后输出会有所不同吗 我的哈希发生了什么use strict 如何修复程序以供使用use strict echo e key1 nkey2 nkey3 perl lne use stric
  • Perl 单元测试只针对模块,而不针对程序吗?

    我在网上找到的文档和我拥有的书 Perl测试 或者说或者建议 Perl 的单元测试通常是在创建模块时完成的 这是真的 有没有办法使用单元测试实际程序Test More和表兄弟姐妹 当然 您可以使用测试脚本测试 更多 http search
  • 并发:C++11 内存模型中的原子性和易失性

    全局变量在 2 个不同内核上的 2 个并发运行的线程之间共享 线程对变量进行写入和读取 对于原子变量 一个线程可以读取过时的值吗 每个核心可能在其缓存中具有共享变量的值 并且当一个线程写入缓存中的其副本时 不同核心上的另一个线程可能会从其自
  • 插入并发问题-多线程环境

    我有一个问题 即使用完全相同的参数在完全相同的时间调用相同的存储过程 存储过程的目的是获取记录 如果存在 或创建并获取记录 如果不存在 问题是两个线程都在检查记录是否存在并报告错误 然后都插入新记录 在数据库中创建重复记录 我尝试将操作保留
  • 如何在.NET 中编写安全/正确的多线程代码?

    今天我必须修复一些使用线程的旧 VB NET 1 0 代码 问题在于从工作线程而不是 UI 线程更新 UI 元素 我花了一些时间才发现可以使用 InvokeRequired 断言来查找问题 除了上面提到的并发修改问题之外 还可能遇到死锁 竞
  • std::map 只读操作的线程安全

    我有一个 std map 用于将值 字段 ID 映射到人类可读的字符串 当我的程序在任何其他线程启动之前启动时 该映射会被初始化一次 之后就不会再被修改 现在 我为每个线程提供了这个 相当大的 映射的自己的副本 但这显然是内存使用效率低下
  • 线程安全的get(访问器方法)

    我目前正在使用以下代码对变量进行线程安全访问 int gnVariable void getVariableValue int pnValue acquireLock Acquires the protection mechanism pn
  • Perl 中的全局变量、子程序变量问题

    如何将子程序变量值转移到另一个子程序变量中 我可以使用全局变量吗 sub foo my myvar Hello sub foo1 my myvar1 myvar how can I get the Hello from myvar 我尝试使
  • 找不到 DBI.pm

    我正在尝试启动这个脚本 usr bin perl use DBI my dbh DBI gt connect dbi Oracle host lonlin2 sid TIMFX1AD port 1524 xbsesdbo xbsesdbo1
  • 单线程程序中可以有竞争条件吗?

    您可以在here https en wikipedia org wiki Race condition Software关于什么是竞争条件的一个很好的解释 我最近看到很多人对竞争条件和线程做出了令人困惑的陈述 我了解到竞争条件只能发生在线程
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne
  • 如何使用 Perl 正则表达式匹配字符串末尾/开头处的空格或单词?

    我想找到与我的正则表达式匹配的序列 它们应该位于由空格包围的字符串中间 末尾或开头或者是字符串中唯一的东西 Example 我们假设序列 qwe45rty 就是我们正在寻找的 我希望能够对所有这些因素都抱有积极的态度 qwe45rty qw
  • std::condition_variable::wait_for 和 std::condition_variable::wait_until 有什么区别?

    The 我正在使用的参考 http en cppreference com w cpp thread condition variable对两者的解释如下 wait for 阻塞当前线程 直到条件变量被唤醒或在指定的超时持续时间之后 wai
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • Android 为什么这不会抛出错误的线程异常?

    我的印象是视图只能从主线程操作 但是 为什么这不会崩溃 public class MainActivity extends Activity TextView tv Override protected void onCreate Bund
  • 终结器线程的范围是什么 - 每个应用程序域或每个进程?

    根据我的所有阅读 应该有一个 GC 线程来调用所有终结器 现在的问题是这个 一个 线程的范围是什么 每个进程或每个应用程序域 因为域的整体目的是在一个进程空间中分离并创建 独立 的不同应用程序 I read here http dn cod
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • Sling Servlet 中的 CQ5 QueryBuilder 参考

    我像这样声明一个 sling servlet Component metatype false Service Servlet class Properties Property name sling servlet paths value
  • Flash CS6 项目面板错误错误#2032:流错误

    卸载 CS5 5 并安装 CS6 后 我的项目选项卡损坏了 这是它显示的内容 Error 2032 Stream Error URL file C Users Eric AppData Local Adobe Flash CS6 en US
  • 使用 Google 地图 API 的地图和移动标记

    我必须写一个演示 这应该像航班内移动地图并需要绘制相同的曲线Polyline between two geo points locations正如你所看到的下图 Even I would not mind switching到其他一些 SD
  • CSS 溢出的属性

    我有两个与 CSS 溢出属性相关的问题或者更确切地说需要澄清 据说 具有非可见溢出值的框将垂直扩展 包围任何浮动的后代盒子 另外关于利润率 据说 对于具有溢出值的盒子 边距永远不会崩溃 比可见的 您能否用相同的实际用途解释这两点 如果您可以
  • mysqli_poll() - 第三个参数有什么用?

    在没有任何文件的情况下超越函数原型 http php net manual en mysqli poll php我正在努力寻找 mysqli poll 函数的第三个参数是什么 int mysqli poll array read array
  • Makefile 只能在发生错误时才执行代码吗?

    在我的 Makefile 中 我有一些检查网络连接的代码 该代码需要相当多的时间来运行 我只想在另一个目标无法构建时运行它 当前的生成文件 all files network compile files files get files fr
  • XCUITest - 如何在应用程序运行时禁用 Wi-Fi?

    我想在运行 XCUITest 时自动化 ios 应用程序的行为 手动执行测试时 我关闭了无线适配器 如何使用 Xcode UI 测试来做到这一点 thanks 附注我发现我们可以使用下面的命令来禁用 wi fi 但要做到这一点 我需要将我的
  • Android 同时使用 getFragmentManager 和 getSupportFragmentManager 会导致重叠

    我的活动中有这样的内容 Override public void onNavigationDrawerItemSelected int position Fragment fragment null switch position 1 ca
  • 获取已连接的 USB 设备列表

    如何获取 Windows 计算机上所有已连接 USB 设备的列表 为您的项目添加对 System Management 的引用 然后尝试如下操作 using System using System Collections Generic u
  • 获取 UIView 框架的缩放动画

    我正在尝试添加一个带有过渡样式缩放动画的 UIView 如下所示 lt gt v 视图以一个小框架 centerParent x centerParent y 20 20 开始 然后更改为 centerParent x centerPare
  • CSS 模糊滤镜在 Firefox 和 IE 10 中不起作用,有其他选择吗?

    我使用这个 CSS 代码blur effect blur webkit filter blur 5px moz filter blur 5px o filter blur 5px ms filter blur 5px filter blur
  • 春季验证@AssertTrue

    如何在视图 jsp 上显示由于以下原因而发生的验证错误消息 AssertTrue注解 它不依赖于特定字段 但我用它来验证字段组合 如果我使用
  • 在 Raspberry Pi 上使用 Python smbus - 与语法混淆

    我正在尝试在 Raspberry Pi 上使用 python smbus 使用 I2C 与 MMA7660 加速计芯片进行通信 在下面的代码中 我正在读取芯片的寄存器 0x 00 0x01 0x02 和 0x03 并且我得到的值完全相同 查
  • 如何在 Bash 中隐藏命令输出

    我想让我的 Bash 脚本对最终用户来说更加优雅 Bash 执行命令时如何隐藏输出 例如 当 Bash 执行时 yum install nano 执行 Bash 的用户将看到以下内容 Loaded plugins fastestmirror
  • Apache TOMCAT 上的 Ember-CLI

    我正在尝试在 Apache tomcat 上加载 ember cli 内置服务器应用程序 我使用以下命令在生产模式下构建了我的应用程序 ember build 环境制作 我把文件移到了我的 dist文件夹到我的 apache tomcat
  • setInterval和clearInterval,如何只运行1次?

    我只想运行该函数 1 次 timerA setInterval function codes clearInterval timerA 2000 我只想调用 setInterval 内的函数 1 次 我该如何使用 setInterval 和
  • 添加新 UIWindow 时以编程方式隐藏状态栏?

    当显示我自己的自定义警报时 我目前正在向我的应用程序添加一个新的 UIWindow 在添加此 UIWindow 之前 我的应用程序隐藏了状态栏 但现在它是可见的 如何在这个新窗口中以编程方式隐藏状态栏 我已经尝试了一切 但它不起作用 这就是
  • (在哪里)clang 是否记录了实现定义的行为?

    C 中实现定义的行为是未指定的行为 每个符合要求的实现都必须记录其选择 我很容易找到 gcc 的此类文档here https gcc gnu org onlinedocs gcc 5 3 0 gcc C Implementation htm
  • 无法从 RTCPeerConnection 获取 IP V4 地址 - chrome

    我需要从 Web 应用程序获取客户端本地 IP 地址 为此 我使用标准 RTCPeerConnection 实现来获取 但是返回的ice候选并不携带IP V4地址 而是一个看起来像guid的地址 asdf xxxx saass xxxx l
  • 如何让我的 Perl 脚本对子进程使用多个核心?

    我正在研究一个数学模型 该模型使用 XFOIL 生成的数据 XFOIL 是一种流行的航空航天工具 用于查找机翼的升力和阻力系数 我有一个 Perl 脚本 它使用不同的输入参数重复调用 XFOIL 以生成我需要的数据 我需要 XFOIL 运行