Parallel::ForkManager - 在父子之间共享哈希的更好方法是啥? [复制]

Posted

技术标签:

【中文标题】Parallel::ForkManager - 在父子之间共享哈希的更好方法是啥? [复制]【英文标题】:Parallel::ForkManager - what is better way to share hash between parent and child? [duplicate]Parallel::ForkManager - 在父子之间共享哈希的更好方法是什么? [复制] 【发布时间】:2018-03-24 13:09:13 【问题描述】:

我想使用 Parallel::ForkManager 获取所有子元素的所有元素的哈希。

use strict;

use Parallel::ForkManager;

my @arr2 = (a, b, c, d);

foreach ( @arr2 ) 

    $pid = $pm->start

    $hash$_ = localtime;

    # STORE ABOVE ELEMENT TO EXIST HASH

    my $pid = $pm->start and next;


$pm->wait_all_children;

READ %hash

输出

$hasha = 11:02
$hashb = 11:03
$hashc = 11:04
$hashd = 11:05

是否可以通过run_on_exit 回调共享散列元素?或者我必须使用外部文件?哪个模块以最简单的方式完成?我试过 IPC::Shareable 和 DBM::Deep。它们不适用于我的脚本。

【问题讨论】:

它适用于 Parallel::ForkManager ?? Parallel::ForkManager` 提供了一个子进程将数据发送回父进程,在其文档中进行了解释。缺点是它为此使用文件。有关示例,请参阅 this post 和 this post。 我试过 IPC::Shareable。有错误IPC::Shareable::SharedMem: shmget: File exists at /home/f/perl5/lib/perl5/IPC/Shareable.pm line 567. 在 DBM::Deep 我有错误DBM::Deep: Cannot write to a deleted spot in DBM::Deep. at ./backtest.pl line 581 和其他人。我阅读了有关 run_on_exit 的信息,在我的情况下,这种方式看起来并不容易。 使用 DBM::Deep 和 IPC::Shareable 显示您的代码 【参考方案1】:

线程可以轻松共享数据:

#!/usr/bin/perl
use warnings;
use strict;

use threads;
use Thread::Queue;

my $q = 'Thread::Queue'->new;

my @workers = map 'threads'->create(sub 
    $q->enqueue([ 'threads'->tid, scalar localtime ]);
), 1 .. 4;

$_->join for @workers;

my %hash;
while ($q->pending) 
    my $data = $q->dequeue;
    $hash $data->[0]  = $data->[1];


use Data::Dumper; print Dumper \%hash;

【讨论】:

"The use of interpreter-based threads in perl is officially discouraged" @Borodin:我知道 IRC 的人已经厌倦了一遍又一遍地回答相同的问题,但我仍然不明白为什么他们的感受会反映在官方文档中。 详情见nntp.perl.org/group/perl.perl5.porters/2015/05/msg227743.html或perlmonks.org/?node_id=1107534。 这很有趣;谢谢。 我使用的是 ForkManager 而不是线程。我写这个有问题。

以上是关于Parallel::ForkManager - 在父子之间共享哈希的更好方法是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Perl,Parallel::ForkManager - 如何实现 fork 超时

如何在 perl 中安装 parallel-forkmanager

Perl Parallel::ForkManager ,fork 条件改变需要很长时间

使用 Parallel::ForkManager 并行执行命令

为啥 Parallel::ForkManager 创建子进程很好,但不能并行处理它们

在 Perl 中,如何验证 Parallel::ForkManager 的每个子项是不是都完成了它的工作?