gpt4 book ai didi

perl - 在 fork 里失去 child

转载 作者:行者123 更新时间:2023-12-01 23:34:53 26 4
gpt4 key购买 nike

use strict;
use warnings;
use Parallel::ForkManager;

my $log = "/scripts/downloads/test.log";
print "Check the $log file\n" and open(LOG,">$log");
*STDERR = *LOG;
*STDOUT = *LOG;

my $pmm=new Parallel::ForkManager(9);

my @arr=(1..200);
for(@arr){

$pmm->start and next; # do the fork
print $_."\n";
$pmm->finish; # do the exit in the child process
}

$pmm->wait_all_children;

open(READ,"$log") or die $!;
my @check=<READ>;

print "there are ".scalar @arr ." items....";
print "but we only got ".scalar @check." items\n";

这是我正在使用的脚本的简化版本。在这种情况下,每次我使用超过 9 个 child 时,我都会失去 3-15 个 child ,有时甚至更多。显而易见的答案是使用更少的 child ,但在我的“真实”脚本中,如果我使用更少的 child ,脚本将花费更多的时间来完成……我们没有时间。为什么它会丢失 child ,如果他们没有运行,是否有办法“捕获”他们并重新运行它们?

谢谢!

最佳答案

您让您的所有 child 写入同一个日志文件,并且您没有采取任何措施来防止他们覆盖彼此的输出。由于无法在我的机器上重现该问题,我不能肯定地说,但我猜所有 N 个 child 实际上都在运行,但一些输出被破坏了。

要让 N 个进程同时写入同一个文件而不丢失任何输出,您必须打开文件进行追加,而不是常规写入。在 C 中,您可以将标志 O_WRONLY|O_APPENDopen(2) 一起使用, 或模式 "a"fopen(3) .然后内核确保所有写入都到达文件的末尾。 (不过,根据手册页,这在 NFS 上并不可靠。)您还必须注意一次写入文件的多少,否则一个进程的输出可能会显示在另一个输出的中间。我不知道这些事情在 Perl 中是否可行,但听起来您无论如何都找到了另一种解决方案。

关于perl - 在 fork 里失去 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6886826/

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