我使用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' => ' / _ API /收集/ 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;
答案 0 :(得分:2)
为了使其能够与多个进程一起使用,您还需要多个连接(理想情况下,每个进程一个)。 否则,单个(共享)连接将由多个进程并行使用,这可能会搞砸它。
可以预先创建一个连接池,并在它分叉时将空闲连接从池传递给子进程。子进程终止时,您可以返回池的连接。我不知道它如何与Perl一起工作,只是想分享一般的想法。