【问题标题】:java doesnt seem to read my perl piped output intime and is filling upjava似乎没有及时读取我的perl管道输出并且正在填满
【发布时间】:2010-07-29 09:17:46
【问题描述】:

我有以下 sn-p 调用一个写入 STDERR 和 STDOUT 的 perl 脚本。 我一直在遵循推荐的程序,例如在 perl 脚本中自动刷新 STDOUT 和 STDERR 以及使用 streamgobbler 线程。我注意到这在一定程度上有助于解决我的问题,但有时 perl 脚本会生成大量输出,但它仍会填满管道并挂起。唯一似乎阻止了将以下内容添加到我的 perl 脚本的事情,但显然我想要输出,所以这不是一个选项。

更新>>

另一个有趣的事件是当我在 linux 中 cat /proc/pid/fd/pipe# 时,它会导致管道被读取以被访问。这似乎转储了管道的内容,这意味着我的 perl 进程可以再次写入它并因此完成。因此必须是我的 java 进程没有正确读取进程输出流。

PERL:

close STDOUT 
close STDERR

我的 java 如下所示

   parserProcess = run.exec(config.getCMDArray(),env);

StreamGobbler errorGobbler = new StreamGobbler(parserProcess.getErrorStream(), "ERROR");

  // any output?
     StreamGobbler outputGobbler = new StreamGobbler(parserProcess.getInputStream(), "OUTPUT");

  // kick them off
     errorGobbler.start();
     outputGobbler.start();

StreamGobbler 在哪里 ->

class StreamGobbler extends Thread
{
    InputStream is;
    String type;

StreamGobbler(InputStream is, String type)
{
    this.is = is;
    this.type = type;
}

public void run()
{
    try
    {
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line=null;
        while ( (line = br.readLine()) != null)
            System.out.println(type + ">" + line);    
        } catch (IOException ioe)
          {
            ioe.printStackTrace();  
          }
}
}



 String line="";

 status = parserProcess.waitFor();

提前致谢

【问题讨论】:

  • 如果你的 Perl 脚本所做的只是关闭 STDOUT 和 STDERR,难怪你会明白 ;) 你能发布你的 Perl 脚本也做什么吗?

标签: java perl pipe


【解决方案1】:

我认为您正在描述您的 perl 和 java 应用程序的正常行为。管道后面缓冲区的实际大小取决于未定义/操作系统,但它可能低至 1KB 或 16KB。输出生成过程在其文本被消费之前阻塞是好的和明智的;什么是替代方案?为管道缓冲区分配越来越多的内存?

如果您使用上述代码进行实验,那么您的处理速度会受到 Java 控制台输出的瓶颈,即 System.out.println() 调用。我认为,如果您将打印结果注释掉(仅用于测试),您会看到 Java 非常快地吞食 Perl 输出。

【讨论】:

  • 另一种方法是通过文件进行进程间通信。虽然它也有缺点(需要清除输入流上的 EOF 条件、性能、磁盘填满的东西,...) /跨度>
  • 好吧,他可以让 perl 程序写入文件并运行完成,然后启动 java 应用程序并运行它……我们不知道这两个程序是否真的有严格的要求并排运行。但是根据文件将管道拼凑在一起似乎是一个糟糕的主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
相关资源
最近更新 更多