Могу ли я использовать AnyEvent->timer() в AnyEvent::Fork?
Допустим, я работаю с номером N объекта счета.
Я хотел бы создать для N Account несколько вилок и самостоятельно включить событие AnyEvent-> timer (). вот как выглядит мой код:
for my $num_account (1..2) {
my $fork_1 = AnyEvent::Fork
->new
->require ("TweetFactory")
->fork
->run ("TweetFactory::worker",sub {
my ($master_filehandle) =@_;
my $wait1 = AnyEvent->timer(after => 0, interval => 100 ,cb => sub {
my $account = UsersPool::get_account($num_account);
my $tf = new TweetFactory ({account => $account, topic => $topic});
%search_article = $tf->search_articles_from_topic_list($dbh,\$db_access,@rh_website);
$tf->save_url_to_process($dbh,\$db_access,%search_article);
@url_to_process = $tf->get_url_to_process(100,$dbh,\$db_access);
%articles_urls_titles = $tf->get_infos_url($mech,@url_to_process);
$tf->save_url_processed($dbh,\$db_access,%articles_urls_titles);
});
});
my $fork_2 = AnyEvent::Fork
->new
->require ("TargetUsers")
->fork
->run ("TargetUsers::worker",sub {
my ($master_filehandle) =@_;
my $wait2 = AnyEvent->timer(after => 0, interval => 80, cb => sub {
my $account = UsersPool::get_account($num_account);
TargetUsers::save_all_messages($account,$dbh,\$db_access);
});
});
my $fork_3 = AnyEvent::Fork
->new
->require ("TargetUsers")
->fork
->run ("TargetUsers::worker",sub {
my ($master_filehandle) =@_;
my $wait3 = AnyEvent->timer(after => 0 , interval => 80, cb => sub {
my $account = UsersPool::get_account($num_account);
TargetUsers::save_followers($dbh,\$db_access,$account);
});
});
AnyEvent::Loop::run;
}
Но во время выполнения таймеры не запускаются.
Я, наоборот, попытался запустить событие AnyEvent-> timer, в котором я создаю свой форк:
my $wait2 = AnyEvent->timer(after => 0, interval => 10, cb => sub {
my $fork_2 = AnyEvent::Fork
->new
->require ("TargetUsers")
->fork
->run ("TargetUsers::worker",sub {
my ($master_filehandle) =@_;
my $account = UsersPool::get_account($num_account);
TargetUsers::save_all_messages($account,$dbh,\$db_access);
});
});
В этот момент событие было хорошо запущено, но мне пришлось ждать выполнения последнего события, чтобы создать следующий форк.
У вас есть идея, пожалуйста? Спасибо
1 ответ
Сначала несколько замечаний: в вашем примере вам не нужно вызывать ->fork. Вы также не показываете код, запущенный в разветвленном процессе, вы только показываете, как вы создаете таймеры в родительском процессе, и они, безусловно, должны работать. Наконец, вы, похоже, ничего не делаете с разветвленным процессом (вы ничего не делаете с $master_filehandle).
Что еще более важно, ваш пример создает и мгновенно уничтожает объекты fork, они никогда не переживают цикл, и вы фактически вызываете функцию цикла внутри цикла for, так что, вероятно, вы не выполните цикл более одного раза
Возможно, в этом есть какое-то недопонимание - обратный вызов, который вы передаете для выполнения, выполняется в родительском, тот же процесс, при котором вы выполняете AnyEvent::Fork->new. Код, который выполняется в дочернем элементе, будет, например, функцией TargetUsers::worker.,
Чтобы таймеры работали во вновь создаваемых процессах, вам необходимо запустить в них цикл обработки событий.
Возможно, AnyEvent::Fork::RPC с асинхронным бэкэндом будет более подходящим для вашего случая: он запускает цикл обработки событий для вас, имеет более простое использование запросов / ответов и может передавать данные во вновь созданный процесс.