Multithreading Perl:子线程中变量$^T的值
$^T以秒为单位存储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
#!/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()两次很容易理解。我将关注实时和运行时的差异。非常感谢。