如何在多进程中使用arangodb集合

时间:2014-10-07 15:48:32

标签: arangodb

我使用Anyevent :: Fork :: Pool或Parallel :: ForkManager来创建100个perl进程。我想在Global中创建数据库和集合,并在函数中使用集合对象。但它不起作用。 我的示例代码如下:

use ArangoDB;
my $itdb = ArangoDB->new(
{
    host       => '10.211.55.18',
    port       => 8529,
    keep_alive => 1,
    timeout    => 10,
}
);
my $Node_Coll = $itdb->( 'Node' );

...

sub function{
    $Node_Coll->count();
}

它的反馈"错误无法调用方法" http_get"在一个未定义的值"。我在全局和函数中打印$ Node_Coll。它有所不同。

在全球范围内,$ Node_Coll是正常的。但它在功能上是错误的。 功能:     祝福({                  '分贝' =>民主基金,                  '名称' => '节点&#39 ;,                  '状态' => 3,                  '代码' => 200,                  ' _api_path' => ' / _ AP​​I /收集/ 250177068120&#39 ;,                  ' ID' => ' 250177068120&#39 ;,                  '连接' =>民主基金                },' ArangoDB :: Collection' );

如果我把"我的$ Node_Coll = $ itdb->(' Node');"在本地功能,没关系。像这样。     子函数{         我的$ Node_Coll = $ itdb->(' Node');         $ Node_Coll->计数();     }

我不知道为什么会这样。我认为它可能在多进程中使用一个套接字" $ itdb->(' Node');"在全球范围内 因为" $ itdb->(' Node');"将发送一个http_get请求,它会产生额外的负载,特别是在多进程环境中。如果我们能保存它会更好。

2014年8月10日更新: 数据准备:     将一些数据插入Collection' Node'。 执行方法:  保持脚本。并执行$。/ count_srv.pl  2.修改了脚本。评论"我的$ Node_Coll = $ itdb->(' Node');"在count()。在全球范围内取消注释。并执行$。/ count_srv.pl

count.pm如下:

package Count;
use ArangoDB;

my $itdb = ArangoDB->new(
{
    host       => '10.211.55.18',
    port       => 8529,
    keep_alive => 1,
    timeout    => 10,
}
);
#my $Node_Coll = $itdb->( 'Node' );

sub count{
    my $Node_Coll = $itdb->( 'Node' );
    my $count = $Node_Coll->count();
    print "The count is ", $count, "\n";
}

count_srv.pl如下:

use Parallel::ForkManager;
use count;

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

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

Count::count();

$pm->finish; # Terminates the child process
}
$pm->wait_all_children;

1 个答案:

答案 0 :(得分:2)

为了使其能够与多个进程一起使用,您还需要多个连接(理想情况下,每个进程一个)。 否则,单个(共享)连接将由多个进程并行使用,这可能会搞砸它。

可以预先创建一个连接池,并在它分叉时将空闲连接从池传递给子进程。子进程终止时,您可以返回池的连接。我不知道它如何与Perl一起工作,只是想分享一般的想法。