2

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;
4

1 に答える 1

2

これを複数のプロセスで機能させるには、複数の接続も必要になります (プロセスごとに 1 つが理想的です)。そうしないと、単一の (共有) 接続が複数のプロセスによって並行して使用され、混乱する可能性があります。

事前に接続のプールを作成し、フォーク時にプールから子プロセスにアイドル状態の接続を渡すことは問題ありません。子プロセスが終了したら、接続をプールに戻すことができます。これが Perl でどのように機能するかはわかりませんが、一般的なアイデアを共有したかっただけです。

于 2014-10-21T14:09:44.427 に答える