1
我正在執行一個腳本並且讓它分叉並行運行。每個分支進程perl的執行時間
我注意到一些進程需要更多時間來執行,並且希望在每個進程開始和結束時保持跟蹤。
現在,我在執行時打印時間到終端,但不容易確定哪個進程需要時間來執行。
有沒有辦法在使用Perl並行時跟蹤它:ForkManager?
我正在執行一個腳本並且讓它分叉並行運行。每個分支進程perl的執行時間
我注意到一些進程需要更多時間來執行,並且希望在每個進程開始和結束時保持跟蹤。
現在,我在執行時打印時間到終端,但不容易確定哪個進程需要時間來執行。
有沒有辦法在使用Perl並行時跟蹤它:ForkManager?
目前還不清楚您是在尋找關於正在運行的流程的實時反饋,或者您是否只是想了解一個孩子是否最後花費更長時間。假設你只想知道最終結果,下面就足夠了:
使用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。
邁克 -
我想你可以使用像[時間::高分辨率(https://metacpan.org/module/Time::HiRes)的模塊來創建開始的哈希值(ES)/停止時間爲每個線程,然後採取他們之間的差異。 – rutter
謝謝@rutter會研究它 – iDev