Multithreading 什么会导致gunzip/gzip挂起在Perl线程中?
我正在编写的脚本有多个线程。这些线程中的每一个都负责相当数量的IO。我正在使用Perl 5.8.3 需要进行以下文件处理: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`; 及 我愿意接受有关该计划的建议和问题。我只能发布代码的一般部分。此外,我已经读过这篇文章()。我似乎
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上运行更高版本(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;