Multithreading 如何在多线程perl中共享哈希
共享散列的一种方法是声明每一级别的散列,如:Multithreading 如何在多线程perl中共享哈希,multithreading,perl,hash,share,Multithreading,Perl,Hash,Share,共享散列的一种方法是声明每一级别的散列,如: my %hash : shared; $hash{test} = &share({}); 但是,如果第一级密钥的数量无法预测,或者太多以至于您无法声明每个密钥,该怎么办呢 如下面的代码所示: #!/usr/bin/perl -w use strict; use threads; use threads::shared; my %counts :shared; my $infile = $ARGV[0]; open my $inf, "$i
my %hash : shared;
$hash{test} = &share({});
但是,如果第一级密钥的数量无法预测,或者太多以至于您无法声明每个密钥,该怎么办呢
如下面的代码所示:
#!/usr/bin/perl -w
use strict;
use threads;
use threads::shared;
my %counts :shared;
my $infile = $ARGV[0];
open my $inf, "$infile";
while(my $inline = <$inf>){
chomp($inline);
my @entry = split(/\t/,$inline);
my $t = threads->create('WORK',@entry)->join;
}
foreach my $i(sort {$a cmp $b} keys %counts){
foreach my $j(sort {$a cmp $b} keys %{$counts{$i}}){
print "$i\t$j\t$counts{$i}{$j}\n";
}
}
sub WORK{
my @work = @_;
$counts{$work[0]}{$work[1]}++;
}
脚本将通过警告您“某行的共享标量值无效”而停止。那么有没有一种方法可以共享%counts和%{$counts{KEY1}}?假设我不知道在测试集第1列中我将观察到多少种水果,并且输出应该如下所示:
apple pie 1
banana icecream 1
mango juice 1
mango pie 2
orange juice 1
在您的脚本中,您依赖于自动激活:散列和数组一旦被引用,就会突然出现。这通常有效。当
使用线程时,它不会出现(默认情况下,自动激活的数据结构不共享)。如果需要的话,我们可以自己创建子文件夹。这将使您的工作
sub
sub WORK{
unless (exists $counts{$_[0]}) {
my %anon :shared;
$counts{$_[0]} = \%anon;
}
$counts{$_[0]}{$_[1]}++;
}
或
或类似的。我还删除了对@
数组相当无用的复制
请注意,您的示例甚至不需要线程。因为你知道
my $t = threads->create('WORK',@entry)->join;
这几乎完全等同于
my $t = WORK(@entry);
另外,join
返回线程的返回值(在本例中是增量之前的计数,因为它是最后一条语句的值),而不是线程对象。谢谢!我知道它可以简化,我创建这个示例只是为了学习如何在perl中使用多线程。但是在第二种解决方案中,你是指/=还是| |=?@lolibility我使用了/=
。它的意思是“未定义时分配”$a/=$b
与$a=定义的$a相同吗$a:$b
。这在古代珍珠中是不可用的。但是,| |=
也可以。
my $t = threads->create('WORK',@entry)->join;
my $t = WORK(@entry);