[英]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.