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 并行执行命令