如何从子进程中获取值?

时间:2014-12-16 18:56:43

标签: linux perl process multiprocessing fork

我有一个脚本,在某些方面我分叉一些进程来执行任务,主进程等待所有孩子完成。
到目前为止一切都好。
问题:我有兴趣获得每个子进程在处理它必须做的事情时花费的最长时间 我现在所做的只是查看日志,其中我打印了子进程所执行的每个操作所花费的时间,并尝试或多或少地计算出时间。
我知道从子进程中获取某些东西的唯一方法是通过某种共享内存,但我想知道这个特定的问题是否有“准备好”/简单的解决方案?
我的意思是为了让时间回归,父进程在一个地方以一种很好的方式打印它们 我认为可能有更好的方法,而不仅仅是检查整个日志....

根据评论进行更新
我对儿童过程的时间不感兴趣,即哪个孩子花了最多的时间来完成。每个子进程都在处理X任务。每个任务都需要在更糟糕的情况下完成Y秒。我希望找到Y,即子进程完成其中一个X任务所花费的最多时间

1 个答案:

答案 0 :(得分:1)

fork()的最大限制是它不像threads那样容易地执行IPC。除了在进程启动和退出时捕获,否则您正在执行的操作包含perl文档的整个部分。

我建议您可能想要的是pipe并将其连接到孩子身上。

像这样的东西(尚未测试,我在Windows机器上!)

use strict;
use warnings;

use Parallel::ForkManager;

my $manager = Parallel::ForkManager -> new ( 5 ) ; 
pipe ( my $read_handle, my $write_handle );

for ( 1..10 ) {
    $manager -> start and next; 
    close ( $read_handle ); 
    print {$write_handle} "$$ - child says hello!\n";
    $manager -> finish; 
}
close ( $write_handle ); 

while ( <$read_handle> ) { print; }

$manager -> wait_all_children();