我正在学习Perl的多线程。我的代码:
use warnings;
use threads;
use threads::shared;
$howmany = 10;
$threads = 5;
$to = int($howmany / $threads);
for (0 .. $threads) {$trl[$_] = threads->create(\&main, $_);}
for (@trl) {$_->join;}
sub main {
for (1 .. $to) {
print "test\n";
}
}
exit(0);
我想打印这个词test $howmany
次在$threads
线程。
这段代码打印test12次。哪里有问题?
我可以建议一种替代方法吗?
use strict;
use warnings;
use threads ;#qw( async );
use Thread::Queue qw( );
my $num_workers = 5;
my $num_work_units = 10;
my $q = Thread::Queue->new();
# Create workers
my @workers;
for (1..$num_workers) {
push @workers, async {
while (defined(my $unit = $q->dequeue())) {
print("$unit\n");
}
};
}
# Create work
for (1..$num_work_units) {
$q->enqueue($_);
}
# Tell workers they are no longer needed.
$q->enqueue(undef) for @workers;
# Wait for workers to end
$_->join() for @workers;
优点:
- 更具可扩展性
- 即使 $num_work_units / $num_workers 不是整数也可以工作。
- 不假设所有工作单元需要相同的时间来完成。
Output:
1
5
2
8
9
10
7
3
4
6
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)