[英]Adding Key/Value To Hash(Perl)
嗨,我正在尝试将多个键/值添加到哈希中。 基本上是文件名及其数据。 每个json文件的内容都有哈希和数组引用。 包含文件名和数据的哈希将在其他位置处理。
这是我的代码:
sub getDecode {
my $self = shift;
my @arrUrls = ('http://domain.com/test.json', 'http://domain.com/test_two.json', 'http://domain.com/test3.json');
my $resQueue = Thread::Queue->new();
my $intThreads = 10;
my @arrThreads = ();
my %arrInfo = ();
foreach my $strUrl (@arrUrls) {
for (1..$intThreads) {
push (@arrThreads, threads->create(sub {
while (my $resTask = $resQueue->dequeue) {
my $resData = get($strUrl);
my $strName = basename($strUrl, '.json');
my $arrData = decode_json($resData);
$arrInfo{$strName} = $arrData;
}
}));
}
}
$resQueue->enqueue(@arrUrls);
$resQueue->enqueue(undef) for 1..$intThreads;
$_->join for @arrThreads;
return %arrInfo;
}
当我尝试对%arrInfo
数据转储时,没有给出输出。 请帮忙!
您是多线程的,没有共享变量。 当线程产生时,将克隆现有的变量空间-因此每个线程都有它自己的%arrInfo
本地副本,该副本在退出时将被丢弃。
你需要:
use threads::shared;
my %arrInfo : shared;
您还在线程生成循环中做一些奇怪的事情-您生成10个线程x 3个URL-用于30个线程,但仅排队3个URL进行处理。 但是然后您实际上根本就没有使用$resTask
,这没有任何意义。
因此,我敢打赌您的代码最终会挂起,因为您正试图加入一些未完成的线程。
您可能会发现$resQueue -> end()
比排队undef
更合适。
使用共享哈希的示例:
use strict;
use warnings;
use threads;
use threads::shared;
use Data::Dumper;
my %test_hash : shared;
my %second_hash;
$test_hash{'from_parent'} = 1;
$second_hash{'from_parent_too'} = 1;
threads->create(
sub {
$test_hash{'from_first'} = 2;
$second_hash{'from_first_too'} = 2;
}
);
threads->create(
sub {
$test_hash{'from_second'} = 3;
$second_hash{'from_second_too'} = 3;
}
);
foreach my $thr ( threads->list() ) { $thr->join }
print Dumper \%test_hash;
print Dumper \%second_hash;
对于“工人线程”风格的方法,我将提供: Perl用子守护程序守护
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.