Multithreading 什么会导致gunzip/gzip挂起在Perl线程中?

Multithreading 什么会导致gunzip/gzip挂起在Perl线程中?,multithreading,perl,gzip,pipe,zombie-process,Multithreading,Perl,Gzip,Pipe,Zombie Process,我正在编写的脚本有多个线程。这些线程中的每一个都负责相当数量的IO。我正在使用Perl 5.8.3 需要进行以下文件处理: 1) 打开gzip文件,将内容读入某个变量。 2) 关闭来自gzip/gunzip的输入流。 3) 根据变量中的数据执行任意计算。 我尝试了几种不同的压缩文件的方法来获取文件内容: $someVariable = `gunzip -c /path/to/file.gz`; 及 我愿意接受有关该计划的建议和问题。我只能发布代码的一般部分。此外,我已经读过这篇文章()。我似乎

我正在编写的脚本有多个线程。这些线程中的每一个都负责相当数量的IO。我正在使用Perl 5.8.3

需要进行以下文件处理:
1) 打开gzip文件,将内容读入某个变量。
2) 关闭来自gzip/gunzip的输入流。
3) 根据变量中的数据执行任意计算。

我尝试了几种不同的压缩文件的方法来获取文件内容:

$someVariable = `gunzip -c /path/to/file.gz`;


我愿意接受有关该计划的建议和问题。我只能发布代码的一般部分。此外,我已经读过这篇文章()。我似乎遇到了与“Gahoo”类似的问题,但是没有发布解决方案(他的最后评论表明与我遇到的问题有关)。

谢谢
Paul

假设您正确地认为它是backticks或
open-|
,那么它是Perl中的一个bug,并且可能是自10年前的5.8.3以来修复的众多线程bug之一。

我在使用Cygwin在Windows中调度Perl线程时遇到过这个问题。但是,在Linux中调度的Perl线程中gzip时,不会出现此问题。这让我相信这是一个Cygwinbug。您有两个选项来解决此问题:

  • 在Linux中运行脚本
  • 使用IO::解压::Gunzip()而不是gzip/Gunzip。这个实现不会挂起,但速度要慢得多

  • 在Linux上运行更高版本(5.20.1)时,我遇到了同样的问题。虽然我没有找到一个确定的解决方案,但我确实找到了一个解决方法,即对gunzip使用system()调用,并将输出重定向到一个临时文件(我用线程#附加了临时文件),然后使用标准的open()调用读入该临时文件。基于此,问题似乎是在使用上述gzip方法时使用stdout。这种解决方法远不理想,可能需要改进以使其更加健壮,但在某些情况下是可以接受的。 例如:

    system(“gunzip-c$filename>tmp_文件”.threads->tid());
    
    open FOO,“仅供参考,这似乎不是一个僵尸进程。ps输出中的“S”表示进程正在休眠。这可能意味着进程正在等待输入。我的猜测是,卡住的文件确实有一些特殊之处(特别是未跳过的shell元字符)。是的,我不完全确定如何描述它。从技术上讲,它不是一个僵尸进程,因为它没有丢失父线程,但文件可以在命令行上进行压缩。50%的情况下,它们也可以使用我上面使用的方法之一进行压缩。你知道这个特定问题是否在某个地方被记录了吗?应该是这样的如果我可以引用某种类型的变更日志或bug,这将非常有用。bug tracker和commit日志都可以使用。更简单的方法是尝试一个非老式的构建,看看您是否仍然存在问题。
    $someVariable = "";
    open(my $INPUT,'gunzip -c /path/to/file.gz|');
    
    while(my $line = <$INPUT>){
        $someVariable .= $line;
    }
    close($INPUT);
    
    username 12345  0.0  0.0   1752   400 pts/3    S    May27   0:00 gunzip -c /path/to/file.gz
    
    system("gunzip -c $filename > tmp_file".threads->tid());
    open FOO, "<", "tmp_file".threads->tid() or die $!;
    $output = <FOO>;
    close FOO;