我最初试图通过Thread :: Queue发送散列对象,但根据this link,我的Thread :: Queue和threads版本: :共享太旧了。不幸的是,由于我正在测试的系统不是我的,我无法升级。Perl:如何将散列推入子例程之外的数组
然后我尝试使用一个通用数组来存储我的哈希值。这是迄今为止代码:
#!/usr/bin/perl
use strict;
use warnings;
use threads;
use Thread::Queue;
use constant NUM_WORKERS => 10;
my @out_array;
test1();
sub test1
{
my $in_queue = Thread::Queue->new();
foreach (1..NUM_WORKERS) {
async {
while (my $job = $in_queue->dequeue()) {
test2($job);
}
};
}
my @sentiments = ("Axe Murderer", "Mauler", "Babyface", "Dragon");
$in_queue->enqueue(@sentiments);
$in_queue->enqueue(undef) for 1..NUM_WORKERS;
$_->join() for threads->list();
foreach my $element (@out_array) {
print "element: $element\n";
}
}
sub test2
{
my $string = $_[0];
my %hash = (Skeleton => $string);
push @out_array, \%hash;
}
然而,在手术结束时,@out_array
总是空的。如果我删除脚本的线程部分,则@out_array
正确填充。我怀疑我在这里错误地执行了线程。
在这种情况下,我该如何正确填充@out_array
?
你在我做之前只回答了几秒钟。谢谢:) –
我喜欢用“q”作为“队列”,因为它们听起来一样[除非你像我一样用法语发音“队列”)] – ikegami
修正了一个错误。 (它永远阻塞响应队列。) – ikegami