Multithreading Perl:子线程中变量$^T的值

Multithreading Perl:子线程中变量$^T的值,multithreading,perl,variables,time,share,Multithreading,Perl,Variables,Time,Share,$^T以秒为单位存储perl程序的开始时间。 因为我需要知道一个子线程需要多少秒,所以问题是: 子线程中的$^T是否存储其自身的开始时间?或者只是从其母线程复制值 运行此: #!/usr/bin/env perl use strict; use warnings; sub test_th { print $^T,"\n"; } print $^T."\n" sleep 10; my $thr = threads -> create ( \&test_th ); $t

$^T以秒为单位存储perl程序的开始时间。 因为我需要知道一个子线程需要多少秒,所以问题是: 子线程中的$^T是否存储其自身的开始时间?或者只是从其母线程复制值

运行此:

#!/usr/bin/env perl
use strict;
use warnings;


sub test_th {
    print $^T,"\n";
}

print $^T."\n"
sleep 10;
my $thr = threads -> create ( \&test_th ); 
$thr -> join;
打印相同的值两次

这和预期的一样,因为当您执行线程时,您有效地继承了所有父变量

如果您通过分叉尝试此操作:

 #!/usr/bin/env perl

use strict;
use warnings;

use Parallel::ForkManager;

print $^T, "\n";

for ( 1 .. 2 ) {
    sleep 10;
    $mgr->start and next;
    print $^T, "\n";
    $mgr->finish;
}

$mgr->wait_all_children;
您将获得相同的值,尽管fork的“开始”时间是10秒之后

所以要回答您的问题-否,
$^T
在程序实例化时启动。如果您希望度量线程运行时间之类的事情,那么必须找到其他方法

虽然,给定的“运行时间”充其量是一个非常粗糙的指标(处理器执行诸如调度之类的操作,例如“实时”和“运行时间”实际上并不特别相关)


但也许在每个线程的开始和结束时调用
time()
,可以满足您的需要?或者类似于
Devel::NYTProf

快速测试将显示
$^T
是在进程启动时定义的,而不是在线程启动时定义的

但是没有什么能阻止你在线程开始时注意到。您甚至可以将时间戳保存在
$^T
中,因为它是每个线程的变量

use feature qw( say );
use threads;

sub thread {
   my ($n) = @_;
   sleep $n;
}

sub wrapper {
   my ($n) = @_;
   $^T = time;
   thread($n);
   say sprintf "Thread %s ran for %s seconds.", threads->tid, time-$^T;
}

async { wrapper(5) };
sleep 2;
async { wrapper(2) };
$_->join for threads->list;
输出:

Thread 2 ran for 2 seconds.
Thread 1 ran for 5 seconds.

请注意,分配给
$^T
会将存储的值强制转换为整数,因此它不是存储
Time::HiRes::Time()

的结果的合适位置。这听起来像是一件自己测试起来很简单的事情。还有-你的意思是
线程
还是
分叉
。你想实现什么,因为wallclock秒的度量充其量只是一个粗略的度量。嗨,我刚刚测试过它。它确实是它母亲的复制品。顺便说一句,我使用了threads模块。如果要测量经过的时间,您可能需要使用
Time::HiRes
。是的,调用Time()两次很容易理解。我将关注实时和运行时的差异。非常感谢。