gpt4 book ai didi

perl - Parallel::Forkmanager -> 填充来自子进程的数组哈希值的哈希值

转载 作者:行者123 更新时间:2023-12-01 05:35:12 26 4
gpt4 key购买 nike

我有一段代码想要并行化(仅供引用):

my (%fastas, %counts);

foreach my $sample ( sort keys %AC2 )
{
foreach my $chrom (sort keys %{ $AC2{$sample} } )
{
foreach my $pos ( sort { $a <=> $b } (@{ $allAC2{$chrom} }) )
{
my $allele;

#position was genotyped in sample
# or is AC=1, but was also found in AC=2
if( grep(/\b$pos\b/, @{ $AC2{$sample}{$chrom} }) || grep(/\b$pos\b/, @{ $finalAC1{$sample}{$chrom} }) ) #"\b" is for word boundary -> exact word match
{
$allele = @{ $vcfs{$sample}{$chrom}{$pos} }[2]; #ALT allele
}
#Make sure all SNP positions are in all samples
#Fill with reference genome allele information
else
{
#Fill with reference genome allele information
$allele = substr( @{ $ref{$chrom} }[0], $pos-1, 1); #or die "$sample, $chrom, $pos";
}
push ( @{ $fastas{$sample}{$chrom}{$pos} }, $allele);
push ( @{ $counts{$chrom}{$pos} }, $allele) unless (grep {$_ eq $allele} @{ $counts{$chrom}{$pos} } );
}
}
}

基本上,子进程需要填充两个哈希值。我进行了搜索,只找到了一些示例,展示了如何使用“run_on_finish”从子进程返回变量。 “问题”是我发现的所有示例/教程总是返回标量。

是否可以将一个散列(或 2 个散列)传递出子进程?

谢谢,马可

最佳答案

不返回哈希值,返回哈希引用。

Perl 中的引用是标量值。因此,您所需要做的就是返回对 %fastas%counts 的引用。

这是一个取自 Parallel::Forkmanager 文档的 hacky 示例。它在每个子进程中构建一个哈希,其中包含输入数据建议的尽可能多的元素。它将对该哈希的引用返回给父级,回调将在父级中获取该哈希并将其插入到 $overall 数据结构中。

use strict;
use warnings;
use Data::Printer;
use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(2);

my $overall; # will hold all results in the parent
$pm->run_on_finish( sub {
my ($pid, $exit_code, $ident, $exit_signal, $core_dump, $data_structure_reference) = @_;

$overall->{$pid} = $data_structure_reference;
});

DATA_LOOP:
foreach my $data (1 .. 10) {
# Forks and returns the pid for the child:
my $pid = $pm->start and next DATA_LOOP;

my %child_result = map { $_ => 1 } 1 .. $data;

$pm->finish( 0, \%child_result );
}

$pm->wait_all_children;
p $overall;

输出如下所示:

\ {
1224 {
1 1
},
1225 {
1 1,
2 1
},
1226 {
1 1,
2 1,
3 1
},
1228 {
1 1,
2 1,
3 1,
4 1
},
1230 {
1 1,
2 1,
3 1,
4 1,
5 1
},
1231 {
1 1,
2 1,
3 1,
4 1,
5 1,
6 1
},
1232 {
1 1,
2 1,
3 1,
4 1,
5 1,
6 1,
7 1
},
1233 {
1 1,
2 1,
3 1,
4 1,
5 1,
6 1,
7 1,
8 1
},
1234 {
1 1,
2 1,
3 1,
4 1,
5 1,
6 1,
7 1,
8 1,
9 1
},
1235 {
1 1,
2 1,
3 1,
4 1,
5 1,
6 1,
7 1,
8 1,
9 1,
10 1
}
}

如果要返回两个数据结构,请将它们包装在数组引用中。

$pm->finish( 0, [ \%fastas, \%counts ] ); 

关于perl - Parallel::Forkmanager -> 填充来自子进程的数组哈希值的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40344926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com