首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在AnyEvent::叉中使用AnyEvent->timer()吗?

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

Stack Overflow用户
提问于 2014-05-20 13:37:53
回答 1查看 395关注 0票数 3

假设我使用的是N个帐户对象。

我想为N帐户创建几个分支,并独立地包含一个事件AnyEvent-> timer ()。下面是我的代码:

代码语言:javascript
复制
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,其中我创建了我的分叉:

代码语言:javascript
复制
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);  

       });
            });   

此时,事件已经很好地启动了,但是我不得不等待最后一个事件的执行才能创建下一个叉。

你有什么想法吗?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-25 21:38:12

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

更重要的是,您的示例创建并立即销毁了叉对象,它们无法在循环中存活,而且实际上您在for循环中调用了循环函数,因此您可能不会重复循环一次。

可能涉及到一些误解--您传递给运行的回调是在父进程中执行的,与执行AnyEvent::叉->new的进程相同,在子进程中运行的代码将是TargetUsers::worker函数。

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

也许AnyEvent::叉::RPC与异步后端更适合您的情况:它为您运行一个事件循环,它有一个更简单的请求/响应用法,并且可以向新创建的进程传递数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23761411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档