【问题标题】:What could cause gunzip/gzip to hang in Perl threads?什么可能导致 gunzip/gzip 挂在 Perl 线程中?
【发布时间】: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


【解决方案1】:

假设你是正确的,它是反引号或open -|,那么这是 Perl 中的一个错误,它可能是自十年前的 5.8.3 以来已修复的众多线程错误之一。

【讨论】:

  • 您知道这个特定问题是否记录在某处吗?如果我可以参考某种类型的变更日志或错误,那将非常有帮助。
  • change log、错误跟踪器和提交日志都可用。更简单的方法是尝试非过时的构建,看看是否还有问题。
【解决方案2】:

我在使用 Cygwin 在 Windows 中调度的 Perl 线程中进行 gzip 压缩时遇到了这个问题。但是,在 Linux 中调度的 Perl 线程中进行 gzip 压缩时不会出现此问题。这让我相信这是一个 Cygwin 错误。您有两种选择来解决此问题:

  1. 在 Linux 中运行您的脚本。
  2. 使用 IO::Uncompress::Gunzip (http://perldoc.perl.org/IO/Uncompress/Gunzip.html) 代替 gzip/gunzip。此实现不会挂起,但速度要慢得多。

【讨论】:

    【解决方案3】:

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

    system("gunzip -c $filename > tmp_file".threads->tid());
    open FOO, "<", "tmp_file".threads->tid() or die $!;
    $output = <FOO>;
    close FOO;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      相关资源
      最近更新 更多