在 Perl 中,如何等待线程并行结束?

2023-11-26

我有一个 Perl 脚本,它启动 2 个线程,每个处理器一个。我需要它等待线程结束,如果一个线程结束,就会生成一个新线程。看来 join 方法会阻塞程序的其余部分,因此第二个线程无法结束,直到第一个线程所做的所有事情都完成为止,这违背了它的目的。

我尝试过is_joinable方法,但这似乎也不起作用。

这是我的一些代码:

use threads;
use threads::shared;

@file_list = @ARGV;      #Our file list
$nofiles = $#file_list + 1; #Real number of files 
$currfile = 1;     #Current number of file to process

my %MSG : shared;              #shared hash

$thr0 = threads->new(\&process, shift(@file_list));
$currfile++;
$thr1 = threads->new(\&process, shift(@file_list));
$currfile++;

while(1){
 if ($thr0->is_joinable()) {
  $thr0->join;
        #check if there are files left to process
  if($currfile <= $nofiles){ 
   $thr0 = threads->new(\&process, shift(@file_list));
   $currfile++;
  }
 }

 if ($thr1->is_joinable()) {
  $thr1->join;
        #check if there are files left to process
  if($currfile <= $nofiles){
   $thr1 = threads->new(\&process, shift(@file_list));
   $currfile++;
  }
 }
}

sub process{
       print "Opening $currfile of $nofiles\n";
       #do some stuff
       if(some condition){
               lock(%MSG);
               #write stuff to hash
       }
       print "Closing $currfile of $nofiles\n";
}

其输出是:

Opening 1 of 4
Opening 2 of 4
Closing 1 of 4
Opening 3 of 4
Closing 3 of 4
Opening 4 of 4
Closing 2 of 4
Closing 4 of 4

首先,对代码本身进行一些评论。您需要确保您拥有:

use strict;
use warnings;

在。。。之初every脚本。第二:

@file_list = @ARGV;      #Our file list
$nofiles = $#file_list + 1; #Real number of files 

是不必要的,因为标量上下文中的数组计算为数组中的元素数量。那是:

$nofiles = @ARGV;

会正确地给你文件的数量@ARGV无论其价值如何$[.

最后,通过在启动线程之前对文件列表进行分区,可以使脚本变得更加简单:

use strict; use warnings;

use threads;
use threads::shared;

my @threads = (
    threads->new(\&process, @ARGV[0 .. @ARGV/2]),
    threads->new(\&process, @ARGV[@ARGV/2 + 1 .. @ARGV - 1]),
);

$_->join for @threads;

sub process {
    my @files = @_;
    warn "called with @files\n";
    for my $file ( @files ) {
        warn "opening '$file'\n";
        sleep rand 3;
        warn "closing '$file'\n";
    }
}

Output:


C:\Temp> thr 1 2 3 4 5
called with 1 2 3
opening '1'
called with 4 5
opening '4'
closing '4'
opening '5'
closing '1'
opening '2'
closing '5'
closing '2'
opening '3'
closing '3'  

或者,您可以让线程在完成后继续执行下一个任务:

use strict; use warnings;

use threads;
use threads::shared;

my $current :shared;
$current = 0;

my @threads = map { threads->new(\&process, $_) } 1 .. 2;
$_->join for @threads;

sub process {
    my ($thr) = @_;
    warn "thread $thr stared\n";

    while ( 1 ) {
        my $file;
        {
            lock $current;
            return unless $current < @ARGV;
            $file = $ARGV[$current];
            ++ $current;
        }
        warn "$thr: opening '$file'\n";
        sleep rand 5;
        warn "$thr: closing '$file'\n";
    }
}

Output:


C:\Temp> thr 1 2 3 4 5
thread 1 stared
1: opening '1'
1: closing '1'
1: opening '2'
thread 2 stared
2: opening '3'
2: closing '3'
2: opening '4'
1: closing '2'
1: opening '5'
1: closing '5'
2: closing '4'  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Perl 中,如何等待线程并行结束? 的相关文章

  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • Mysql 时间匹配连接

    我有两个表cpuinfo和jobinfo 我想使用这两种数据创建报告 tabes CREATE TABLE cpuinfo id int 11 NOT NULL AUTO INCREMENT usagetime datetime DEFAU
  • grep 通过彩色文本,例如海湾合作委员会 |颜色gcc | grep 正则表达式

    在 grep 管道输出时 如何使 grep 尊重 ANSI 颜色转义 我很高兴使用其他东西 perl 而不是 grep 我的用户案例 我想要 gcc foobar c colorgcc grep regexp ls color grep f
  • Perl 的 caller() 函数返回错误的行号

    我在 Perl 5 10 1 上运行了以下脚本 usr bin perl use strict use warnings foreach my x 0 x lt 1 x Line 5 print line Line 6 sub print
  • 使用 LWP::Agent 的 Perl JSON::RPC::Client

    我被要求不使用 JSON RPC Client 而是使用 LWP 进行调用 这是我的代码 Server usr bin perl use strict use lib use ServerLib use JSON RPC Server Da
  • 如何使用 c++11 CAS 实现 ABA 计数器?

    我正在基于此实现一个无锁队列算法 http www cs rochester edu research synchronization pseudocode queues html 它使用计数器来解决 ABA 问题 但我不知道如何用c 11
  • HTTP POST 操作出现错误代码 302

    我有一个 perl 脚本 它将数据发送到我用 php 编写的 Web 服务 这是代码 use LWP UserAgent my ua LWP UserAgent gt new my server endpoint http example
  • 如何在其他核心上运行每个线程?

    我有一个 udp 服务器接收数据并计算它 每个角色我都有两个线程 我的CPU是8个多核 我以不同的速度发送数据 但最多我只使用了 cpu 两核 50 的 14 如果我发送更多的数据值 我的缓冲区将填满并且不会使用更多的CPU 为什么每个核心
  • 从创建 UI 的同一线程更新 VCL。为什么?

    我知道我必须调用 Synchronize 来从未创建控件或向窗口发送消息的线程更新 vcl 我经常听到 线程不安全 这个词 但我找不到关于正在发生的事情的实际解释 我知道应用程序可能会因访问冲突而崩溃 但我又不知道为什么 请阐明这个主题 V
  • 可升级读锁的优点?

    我想知道使用可升级读锁与执行这些步骤相比有什么优势 获取读锁 检查条件以查看是否需要进行写锁定 释放读锁 采取写锁定 执行更新 释放写锁 与获取可升级读锁相比 执行上述步骤的一个明显缺点是 步骤 3 和步骤 4 之间存在一个时间窗口 其中另
  • Perl 三元条件运算符

    我正在尝试在脚本中编写更高效的代码 并且有时会实现三元条件运算符 我不明白为什么在循环中使用三元条件运算符时会得到额外的结果 usr bin perl use strict use warnings my array Serial 123
  • SQL 连接两个没有关系的表

    我有具有相同结构的不同表 我想通过其中一列将它们连接起来 问题是他们不共享该专栏中的信息 Table 1 Type A Name Value Table 2 Type B Name Value 结果表 在单列中 nameFromA name
  • C# 中什么时候应该使用 volatile 关键字?

    谁能提供一个很好的解释volatile https learn microsoft com en us dotnet csharp language reference keywords volatileC 中的关键字 它解决了哪些问题 没
  • 如何在 iPhone 上使用带有线程的 sqlite + fdbm 库

    相关这个问题 https stackoverflow com questions 1082554 我想把数据加载放在后台 但是 我收到 库例程调用不按顺序 错误 In 这个所以线程 https stackoverflow com quest
  • 使用正则表达式提取两个短语之间的所有单词[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下正则表达式提取两个短语之间的所有单词 b item W w W 0 2 1 one W w W 0 3 business b b item W w W 0 2 3 three W w W 0 3
  • 在perl中更改多维哈希的第一个键

    我在 perl 中有一个多维哈希 我想更改所选值的第一个键 例如 我有哈希 my Hash1 Hash1 1 12 1 Hash1 1 10 1 Hash1 2 31 1 Hash1 3 52 1 Hash1 3 58 1 Hash1 4
  • 在 Perl 中如何用空格填充字符串的一部分?

    你更喜欢哪个版本 usr bin env perl use warnings use strict use 5 010 my p 7 33 my prompt my key very important text my value Hell

随机推荐

  • 用jquery更改flash src?

    您好 我有一个显示一些链接的闪存菜单 但是当用户登录时 我想将菜单从 menu1 更改为 menu2 这样它将显示 我的帐户 而不是 注册 下面的代码适用于我的闪光灯 div div
  • 如何在android中以编程方式更改应用程序小部件中的图像

    我设计了一个 Android 应用程序小部件 其中有两个ImageView我想更改两个图像ImageView当单击图像以及调用方法时 现在我用RemoteView像这样 RemoteViews views1 new RemoteViews
  • 为什么 Activity 中的 onCreate() 受到保护?

    为什么Activity中的onCreate 受到保护 或者我应该问 为什么它有效 受保护的方法只能在类本身或其后代的内部调用 所以Android系统不能像 act onCreate 那样调用它 那么 怎么称呼呢 顺便说一句 为什么 OnCl
  • xgboost 多类工作中的 base_score 有什么用?

    我正在尝试探索 Xgboost 二元分类以及多类的工作原理 在二进制类的情况下 我观 察到基本分数被认为是起始概率 并且在计算时也显示出重大影响Gain and Cover 在多类别的情况下 我无法弄清楚的重要性基本分数参数 因为它向我显示
  • 如何使用 SVN 日志检测修改的属性

    背景 编写一个自动发布脚本 从SVN导出版本之间更改的文件并上传到远程服务器 svn log 命令显示修改的文件and属性 但似乎没有区分内容修改和属性修改之间的详细输出 我是否错误地读取了此输出 或者是否有一种简单的方法可以获取修订之间已
  • 从网站打开资源管理器窗口

    我的公司有一个用于项目的共享网络文件夹 该文件夹包含我们每个客户的子文件夹 每个子文件夹包含为这些客户完成的项目的所有信息 有道理 是吗 OK 我收到了一项任务 当在我们公司的 MS CRM 中查看客户帐户时 允许用户单击一个按钮 打开资源
  • Try/Catch 内部或外部函数

    我有一个关于使用最佳实践的非常基本的问题try catch 我有一个像这样的简单函数 DAO public void addVehicle Vehicle vehicle em getTransaction begin em persist
  • 如何让 Spring Security 接受 JSON 而不是表单参数?

    我正在尝试更改 JHipster 以便它使用 JSON 对象而不是表单参数进行身份验证 我已经设法使其适用于 JWT 身份验证机制 现在我想为其他身份验证选项执行此操作 有没有一种简单的方法可以更改 Spring Security 的默认安
  • void main() { if(sizeof(int) > -1) printf("true"); }否则 printf("假"); ; [复制]

    这个问题在这里已经有答案了 void main if sizeof int gt 1 printf true else printf false 我期望输出为真 但结果是假的 谁能解释一下输出的原因 sizeof int 属于类型size
  • 检查点是否在圆内

    我有一个以纬度 经度表示的点 Position louvreMuseum new Position 48 861622 2 337474 我有一个以米表示的半径值 我需要检查另一个点 也以纬度 经度表示 是否在圆内 如果我在平坦的表面上 我
  • Webservice 无法在 Android Retrofit 中工作,但可以在 Postman 和 Swift / iOS 中工作,获取 401 Unauthorized

    技术内容 之前的简报对于使用 Retrofit 并不陌生 但遇到了这种奇怪的行为 我很难理解和修复它 我有两个网络服务 在 Postman 和 iOS 中都按预期工作正常 但只有一个在 Retrofit 中工作 而另一个则不行 在我的辩护中
  • Android应用如何自动切换为深色模式?

    我正在制作一个 Android 应用程序 我为深色模式制作了另一个 UI 这就是我所需要的 该应用程序将在当地时间之前自动切换到深色主题 例如 当当地时间太阳落山时 应用程序将切换到黑暗模式 或者另一种选择是在一天中预设的时间切换到深色模式
  • Visual Studio for ASP.NET 5 项目是否需要 .sln 文件?可以只使用 Global.json 吗?

    在 ASP NET 5 项目中 Visual Studio 创建了一个SLN文件 还有一个global json我的理解是核心解决方案文件 Is SLN文件只是为了 VS 支持 你可以在VS中打开一个解决方案而不使用SLN file 我假设
  • Chrome 和 Safari 缓存 302 重定向

    人们已经提出了各种不同的问题 但我还没有看到真正的答案 我们有一个单独的图像服务 我们的网络应用程序使用它来获取一些图像 图像服务经过良好测试并且运行正常 具体来说 我们的应用程序由domain com The src的元素img元素是im
  • 无法连接到端口 5432 上的 Postgresql

    我在运行 Ubuntu Server 14 04 的服务器上安装了 PostgreSQL 9 3 如果我通过终端 ssh 进入服务器 我就可以使用 psql 连接 但是当我尝试配置 pgAdmin III 进行远程连接时 我得到 服务器不监
  • Emacs 有 BNF 模式吗?

    我必须编辑大量 bnf 格式的语法文件 Emacs 中有这样的模式吗 我查看了 CEDET 的语义包 它似乎曾经有 bnf 模式 但现在不再有 这段代码可以在谷歌上搜索 但语义 bnf mode 似乎不存在 autoload semanti
  • 在 shell 脚本运行时编辑它

    您可以在 shell 脚本运行时对其进行编辑并使更改影响正在运行的脚本吗 我很好奇 csh 脚本的具体情况 我让该批处理运行一堆不同的构建风格并运行整夜 如果我在操作过程中发生了一些事情 我想进去添加额外的命令 或者注释掉未执行的命令 如果
  • 对于未关闭“扩展保护”的非 IE 浏览器,对 AD FS 进行 NTLM 身份验证?

    当从在 Windows 上运行的 Google Chrome 或 Firefox 3 5 对 AD FS 2 0 使用 NTLM 身份验证时 这会导致重复登录对话框并最终登录失败 并出现 审核失败 事件 状态为 状态 0xc000035b
  • “非零退出状态” R 3.6.0“Biobase”

    我需要在 R 上安装不同的软件包 操作系统是 ubuntu for windows 当我尝试 BiocManager install Biobase 时 出现以下错误 R data inst byte compile and prepare
  • 在 Perl 中,如何等待线程并行结束?

    我有一个 Perl 脚本 它启动 2 个线程 每个处理器一个 我需要它等待线程结束 如果一个线程结束 就会生成一个新线程 看来 join 方法会阻塞程序的其余部分 因此第二个线程无法结束 直到第一个线程所做的所有事情都完成为止 这违背了它的