2017-02-16 73 views
1

我正在尝试使用Perl做一个相当简单的过程。代码片段:打开管道并延迟解析Perl中的输出

open(FH,"<command> |") or die "Could not run command .. $!\n"; 

print "After open\n"; 

while(<FH>) 
{ 
    print "I am inside loop\n"; 
    <process..something> 
} 

当调用while()时,我看到一些莫名其妙的延迟。我看到开放需要9-10ms才能运行(这在范围内),但是我确实在“打开后”和“我在内部循环”消息之间看到200-250毫秒的延迟。

以前有没有人见过类似的东西?任何帮助,将不胜感激。

感谢 Rajib

+1

那么,你正在运行什么“_command_”,它有什么作用?只有当''while''被''读取时,才完全取决于“_command_”在做什么。如果它睡了2秒钟然后打印,那么你的'while()'将在那里坐2秒。 – zdim

+1

请注意,推荐使用词法文件句柄('my $ fh')和三参数'open',并且更好。 – zdim

+0

我正在运行一个数据库命令db2pd -db -active其输出几乎是瞬间发生的(如果我在程序外尝试)。 – rssarkar

回答

1

这是几乎可以肯定,因为从<命令的输出>被缓冲,直到缓冲区填满或进程终止

可以解决此使用unbuffer可能得到,这假装输出到终端的命令

试着用这个代替

open my $fh, '-|', 'unbuffer <command>' or die "Could not run command: $!\n"; 
+0

非常感谢你们。我非常感谢所有的帮助。在使用zdim的使用open()的3选项格式的建议后,时间降到了〜150-160ms,但是当我使用Borodin的命令时,它下降到了30-35ms! – rssarkar

+0

我打开的最终代码是: open $ FH,' - ','unbuffer db2pd -db $ db -active 2>/dev/null'或死“不能运行命令.. $!\ n “; 我使用了2>/dev/null来删除我的日志文件中的sh:unbuffer not found错误消息。 再次感谢您的帮助。 – rssarkar

+0

@rssarkar:那看起来不太对。你正在打开一个管道,而不是从***它的命令***,你不应该得到一个'无缓冲未找到'的消息。你确定你的系统有'unbuffer'吗? – Borodin