【问题标题】: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

输出

$hash{a} = 11:02
$hash{b} = 11:03
$hash{c} = 11:04
$hash{d} = 11:05

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

【问题讨论】:

  • 它适用于 Parallel::ForkManager ??
  • Parallel::ForkManager` 提供了一个子进程将数据发送回父进程,在其文档中进行了解释。缺点是它为此使用文件。有关示例,请参阅 this postthis 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 显示您的代码

标签: perl


【解决方案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;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2014-01-01
  • 2011-10-26
  • 1970-01-01
  • 2021-06-26
  • 2013-06-13
  • 2012-08-19
相关资源
最近更新 更多