Я использую 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 в global и function. Это другое.
В глобальном режиме $ 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');» в локальной функции все нормально. Именно так. подфункция {my $ Node_Coll = $ itdb -> ('Узел'); $ Node_Coll-> count (); }
Не знаю, почему это так работает. Я думаю, что можно использовать один сокет в многопроцессорном режиме, когда "$ itdb -> ('Node');" в глобальном. Потому что "$ itdb -> ('Node');" отправит запрос http_get, это вызовет дополнительную нагрузку, особенно в среде с несколькими процессами. Лучше, если мы сможем его спасти.
ОБНОВЛЕНИЕ ОТ 10.08.2014: Подготовка данных: Вставьте некоторые данные в сборник «Узел». Метод выполнения: 1. Сохранить сценарий. И выполните $. / Count_srv.pl 2. изменили скрипт. Комментарий "my $ Node_Coll = $ itdb -> ('Node');" в count (). Раскомментируйте в global. И выполните $. / 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;