[英]Does Perl's thread join method wait for the first thread to finish if I launch more than one thread?
foreach $name (@project_list)
{
# a thread is created for each project
my $t = threads->new(\&do_work, $name);
push(@threads, $t);
}
foreach (@threads) {
my $thrd = $_->join;
print "Thread $thrd done\n";
}
sub do_work {
# execute some commands here...
}
project_list是40个项目的列表。 当我为每个项目生成线程时,join方法会等待第一个线程完成,然后移至下一个线程,依此类推吗?
如果是这样,有可能避免吗? 我的意思是有些线程会比其他线程更快地完成,所以为什么要等待?
如果需要更多信息,请告诉我。 谢谢。
$_->join
等待$_
指定的线程完成。 因为按顺序推送它们,并且foreach
按顺序遍历列表,所以可以,您首先要等待第一个线程。
但这无关紧要,因为您正在等待所有线程完成。 无论您是先等待最快的完成者还是最慢的完成者都没关系-无论如何,您将一直在等待所有人。
干嘛要等? 这取决于后处理步骤的范围。
如果后处理步骤需要所有线程在开始工作之前完成,那么不可避免地要等待各个线程。
如果后处理步骤特定于每个线程的结果,则应该可以使线程本身成为后处理的一部分。
在两种情况下, $_->join foreach @threads;
是要走的路。
如果不需要等待线程完成,请使用detach
命令而不是join
。 但是,线程可能返回的任何结果都将被丢弃。
主线程必须存在于所有线程的持续时间内,因此您需要知道它们何时完成。 可以完成队列或信号量。 信号量是最简单的:
use Thread::Semaphore;
my $S = Thread::Semaphore->new();
foreach $name (@project_list)
{
# a thread is created for each project
my $t = threads->new(\&do_work, $name);
$S->down_force(); # take one for each thread
}
$S->down(); # this blocks until worker threads release one each
print "Thread $thrd done\n";
sub do_work {
# execute some commands here...
$S->up(); # here the worker gives one back when done.
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.