Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何从子进程获取值?_Linux_Perl_Process_Multiprocessing_Fork - Fatal编程技术网

Linux 如何从子进程获取值?

Linux 如何从子进程获取值?,linux,perl,process,multiprocessing,fork,Linux,Perl,Process,Multiprocessing,Fork,我有一个脚本,在某些部分我会分叉一些进程来完成一项任务,主进程等待所有子进程完成。 到目前为止一切正常。 问题:我有兴趣获得每个子进程在处理它必须做的事情时所花费的最大时间。 我现在所做的只是查看日志,在日志中我打印子进程执行的每个操作所花费的时间,并尝试找出或多或少的时间。 我知道从子进程获取内容的唯一方法是通过某种共享内存,但我想知道,对于这个特定的问题,是否有“现成的”/“简单的解决方案” 我的意思是为了找回时间,并且父进程在一个地方以一种漂亮的方式打印时间。 我想有一个更好的方法,不只是

我有一个脚本,在某些部分我会分叉一些进程来完成一项任务,主进程等待所有子进程完成。
到目前为止一切正常。
问题:我有兴趣获得每个子进程在处理它必须做的事情时所花费的最大时间。
我现在所做的只是查看日志,在日志中我打印子进程执行的每个操作所花费的时间,并尝试找出或多或少的时间。
我知道从子进程获取内容的唯一方法是通过某种共享内存,但我想知道,对于这个特定的问题,是否有“现成的”/“简单的解决方案”
我的意思是为了找回时间,并且父进程在一个地方以一种漂亮的方式打印时间。
我想有一个更好的方法,不只是检查所有的日志

根据评论更新:

我对子进程的时间不感兴趣,即哪个子进程花费的时间最多。每个子进程处理X个任务。每项任务在最坏的情况下需要Y秒才能完成。我正在寻找Y,即子进程完成X个任务之一所花费的最长时间。

fork()的最大限制是它不像
线程那样容易执行IPC。除了捕获进程启动和退出的时间外,您正在做的其他工作还有整个perl文档

我的建议是,您可能需要的是一个
管道
,并将其连接到孩子

类似这样的东西(还没有测试,我在Windows机器上!)

使用严格;
使用警告;
使用并行::ForkManager;
my$manager=Parallel::ForkManager->new(5);
管道(我的$read\u句柄,我的$write\u句柄);
对于(1..10){
$manager->start和next;
关闭($read_handle);
打印{$write\u handle}“$$-孩子打招呼!\n”;
$manager->finish;
}
关闭($write_handle);
while(){print;}
$manager->wait_all_children();

从技术上讲,从您调用fork()到您等待()退出时,子对象将执行。你可以记录这两次。@MarcB:我不想知道哪个孩子跑得更快,但每个孩子都要完成一系列的任务。我想知道哪项任务完成的时间最长。或者换言之,完成任务的最长时间是多少。现在,我可以在日志中看到这一点(有点……到处都是)。因此,对于你分叉的每个孩子,记录你何时分叉,记录你何时等待()收获,区别在于孩子执行了多长时间。无论哪个孩子有最大的差异,都是执行时间最长的。@MarcB:也许我解释得不对。每个孩子在一个循环中完成X个任务。任务可能在0.5秒或Y秒内完成(更糟的情况)。我想知道X任务中Y秒的最坏情况。也就是什么是Ygotcha。您可以使用共享内存、套接字等。。。与亲子沟通。IPC有很多方法。你只需要选择一个。但是主进程可以进入while循环从管道中读取,然后什么都不可能存在,因为孩子们还没有完成任何事情,go块在等待所有孩子们。对吗?所以我什么都拿不回来了。我是否误解了这一点?Parallel::ForkManager提供了一种自动返回结果的方法已有相当长一段时间了:所有的孩子都在向同一个句柄写入数据,这可能会导致垃圾。使用P::FM提供的机制,而不是这个。@Jim,有问题,但这不是问题。直到所有
$write\u handle
及其所有DUP都关闭,循环才会结束,这在所有子项都退出之前是不会发生的。Re“fork()
的最大限制是它不像线程那样容易进行IPC。”这也是它最大的资产之一。它几乎迫使你使用严格的设计。
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();