繁体   English   中英

将键/值添加到哈希(Perl)

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM