Могу ли я использовать 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 с асинхронным бэкэндом будет более подходящим для вашего случая: он запускает цикл обработки событий для вас, имеет более простое использование запросов / ответов и может передавать данные во вновь созданный процесс.

Другие вопросы по тегам