3

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

我想为N个Account创建几个fork,并独立包含一个事件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 我在其中创建我的 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);  

       });
            });   

此刻,事件启动良好,但我不得不等待最后一个事件的执行才能创建下一个分叉。

你有什么想法吗?谢谢

4

1 回答 1

2

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

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

也许有一些误解 - 你传递给 run 的回调在父级中执行,与你执行 AnyEvent::Fork->new 的过程相同,在子级中运行的代码将是 TargetUsers::worker 函数例如.

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

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

于 2014-06-25T21:38:12.853 回答