gpt4 book ai didi

perl 主程序永远等待

转载 作者:行者123 更新时间:2023-12-01 08:22:42 28 4
gpt4 key购买 nike

我对 perl 比较陌生,我已经编写了一个程序来处理一组 OS 镜像上的相同操作。由于操作相同,因此我使用了线程。附上该程序的缩小版本。问题是,主程序永远不会出来等待。在跟踪时,我看到主程序正在等待“tee”命令。我在这里搞砸了什么?

我在 CentOS 6.7 上使用 Perl 5.1 版,但由于许多其他依赖项,我无法继续前进 :(

#!/usr/bin/perl -w
use threads;


my $tee_pid= open my $tee, "|-", "tee mylog";
my @images = ( "image1" , "image2");

foreach my $image (@images){
$_ = async { do_ops_on_image() };
sleep ( 60 );
}

while( threads->list ) {
for my $joinable ( threads->list( threads::joinable ) ) {
$joinable->join;
}
}
print "All thread completed \n";
close $tee;

sub do_ops_on_image
{
my $time = `date`;
my $id = threads->tid();
sleep (120) if ( $id ==2 );
print $tee "my $id started at $time \n";
}

最佳答案

这似乎是 perl 中的一个错误,已在 5.14.0 版中修复。如果你真的无法安装更新的 perl(除了系统 perl),那么尽量避免 $tee 共享文件句柄,这是导致主线程挂起的原因。

另外,您等待子线程完成的代码使用了一个事件的 CPU 循环,这会消耗大量 CPU。如果您只想等到所有子线程都完成,请执行以下操作

my @threads;
...
for ... {
push @threads, async { ... }
}
...
$_->join for @threads;

关于perl 主程序永远等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50201820/

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