Anyevent::Fork::Pool または Parallel::ForkManager を使用して、100 個の perl プロセスを作成します。グローバルでデータベースとコレクションを作成し、関数でコレクション オブジェクトを使用したいと考えています。しかし、うまくいきません。私のサンプルコードは次のとおりです。
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 は正常です。しかし、それは機能的に間違っています。関数内: bless( { 'db' => undef, 'name' => 'Node', 'status' => 3, 'code' => 200, '_api_path' => '/_api/collection/250177068120', 'id' => '250177068120', 'connection' => undef }, 'ArangoDB::Collection' );
「my $Node_Coll = $itdb->( 'Node' );」と入力すると、ローカル関数でOKです。ちょうどこのような。sub function{ my $Node_Coll = $itdb->( 'Node' ); $Node_Coll->count(); }
なぜこのように機能するのかわかりません。「$itdb->( 'Node' );」の場合、マルチプロセスで1つのソケットを使用する可能性があると思います。グローバルで。なぜなら、「$itdb->( 'Node' );」http_get リクエストを送信すると、特にマルチプロセス環境で余分な負荷が発生します。保存できれば良いのですが。
UPDATE BY 8/10/2014: データの準備: コレクション 'ノード' にいくつかのデータを挿入します。実行方法: 1. スクリプトを保持します。そして、$./count_srv.pl を実行します。 2. スクリプトを修正しました。「my $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;