gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:59:51 26 4
gpt4 key购买 nike

我有一个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

最佳答案

我认为您需要移动将列表中的下一个文件拉入线程本身的代码。

因此,每个线程不仅会处理一个文件,还会继续处理直到列表为空。

这样,您还可以始终节省创建新线程的开销。

然后,您的主线程将同时加入这两个线程。

当然,这需要在列表上进行同步(以便它们不会提取相同的数据)。或者,您可以将列表分成两部分(每个线程一个),但这可能会导致分配不佳。

(PS:没有Perl上帝,只是一个谦虚的和尚)

关于multithreading - 在Perl中,如何等待线程并行结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2453432/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com