2013-10-01 41 views
1

我正在執行一個腳本並且讓它分叉並行運行。每個分支進程perl的執行時間

我注意到一些進程需要更多時間來執行,並且希望在每個進程開始和結束時保持跟蹤。

現在,我在執行時打印時間到終端,但不容易確定哪個進程需要時間來執行。

有沒有辦法在使用Perl並行時跟蹤它:ForkManager?

+1

我想你可以使用像[時間::高分辨率(https://metacpan.org/module/Time::HiRes)的模塊來創建開始的哈希值(ES)/停止時間爲每個線程,然後採取他們之間的差異。 – rutter

+0

謝謝@rutter會研究它 – iDev

回答

2

目前還不清楚您是在尋找關於正在運行的流程的實時反饋,或者您是否只是想了解一個孩子是否最後花費更長時間。假設你只想知道最終結果,下面就足夠了:

使用Benchmark和Parallel :: ForkManager的run_on_finish回調。像這樣的東西可能適合你。我們在分叉時存儲分叉進程的開始時間。當孩子退出時,Parallel :: ForkManager將使用退出的pid調用run_on_finish回調。然後,您可以存儲孩子的結束時間,然後計算與基準的差異。

use Benchmark; 
use Parallel::ForkManager; 

my $max_forks = 5; 

my $mgr = Parallel::ForkManager->new($max_forks); 

my %times; 
$mgr->run_on_finish(sub { 
    my $pid = shift; 
    $times{$pid}->[1] = Benchmark->new; # end time mark 
}); 

for (1 .. $max_forks+1) { # N+1 to show that wait time isn't included. 
    if (my $pid = $mgr->start) { # Parent 
     $times{$pid} = [Benchmark->new, undef]; #start time 
     next; 
    } 

    srand(time^$$); # don't do this in real-world, perldoc srand 
    my $sleep = int(rand(9)); 
    say "$$ sleeping $sleep"; 
    sleep ($sleep); 
    $mgr->finish; 
} 

$mgr->wait_all_children; 

foreach my $pid (keys %times) { 
    say "Pid: $pid, ProcessTime: ", timestr(timediff($times{$pid}->[1], $times{$pid}->[0])); 
} 

有關您可以計算的輸出和其他功能的詳細信息,請參閱基準測試perldocs。

邁克 -

相關問題