我可以在AnyEvent :: Fork中使用AnyEvent-> timer()吗?

时间:2014-05-20 13:37:53

标签: perl timer fork anyevent

我们说我使用N个帐户对象。

我想为N账户创建几个分支,并独立包含一个事件AnyEvent->计时器()。 这是我的代码的样子:

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->我创建我的fork的计时器:

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 个答案:

答案 0 :(得分:2)

首先是一些观察:在你的例子中,你不需要调用 - > fork。您也没有显示在分叉进程中运行的代码,您只显示如何在父进程中创建计时器,这些肯定会起作用。最后,你似乎没有对分叉进程做任何事情(你对$ master_filehandle什么都不做)。

更重要的是,你的例子创建并立即销毁fork对象,它们永远不会在循环中存活,你实际上在for循环中调用了循环函数,所以你可能不会多次循环

可能存在一些误解 - 你传递给运行的回调是在父进程中执行的,同样的进程是你执行AnyEvent :: Fork-> new,在子进程中运行的代码将是TargetUsers ::例如,工人职能。

要使计时器在新创建的进程中工作,您需要在其中运行事件循环。

使用异步后端的AnyEvent :: Fork :: RPC可能更适合你的情况:它为你运行一个事件循环,它有一个更简单的请求/响应用法,它可以传递数据到新创建的数据过程