【发布时间】:2014-05-28 14:19:10
【问题描述】:
我正在编写的脚本有多个线程。这些线程中的每一个都负责大量的 IO。我正在使用 Perl 5.8.3。
以下文件处理是必要的:
1) 打开一个 gzip 压缩文件,将内容读入某个变量。
2) 关闭 gzip/gunzip 的输入流。
3) 给定变量中的数据执行任意计算。
我尝试了几种不同的方法来压缩文件以获取文件内容:
$someVariable = `gunzip -c /path/to/file.gz`;
与
$someVariable = "";
open(my $INPUT,'gunzip -c /path/to/file.gz|');
while(my $line = <$INPUT>){
$someVariable .= $line;
}
close($INPUT);
该过程通常预计需要几个小时,但 gunzip 似乎卡在随机文件上。正在读取的文件没有什么特别之处。每次卡住的文件都不一样,有时根本没有文件卡住(处理同一批)。这是进程信息的样子(使用 ps aux | grep gunzip):
username 12345 0.0 0.0 1752 400 pts/3 S May27 0:00 gunzip -c /path/to/file.gz
我愿意接受有关该计划的建议和问题。我只能发布代码的通用部分。此外,我已经阅读了这篇文章 (How to deal with multiple threads in perl which turn into zombie)。我似乎遇到了与“Gahoo”类似的问题,但是没有发布解决方案(他的最终评论表明与我遇到的问题有关)。
谢谢!
Paul
【问题讨论】:
-
仅供参考,这似乎不是僵尸进程。 ps 输出中的“S”仅表示进程正在休眠。这可能意味着进程正在等待输入。我的猜测是,卡住的文件确实有一些特别之处(特别是未转义的 shell 元字符)。
-
是的,我不完全确定如何描述它。从技术上讲,它不是僵尸进程,因为它没有丢失它的父线程,但是可以在命令行上很好地压缩文件。 50% 的情况下,它们也可以使用我上面使用的一种方法进行压缩。
标签: multithreading perl gzip pipe zombie-process