我们说我使用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);
});
});
此时此事件已经很好地启动了,但是我不得不等待最后一个事件的执行来创建下一个分支。
请问您有什么想法吗?感谢
答案 0 :(得分:2)
首先是一些观察:在你的例子中,你不需要调用 - > fork。您也没有显示在分叉进程中运行的代码,您只显示如何在父进程中创建计时器,这些肯定会起作用。最后,你似乎没有对分叉进程做任何事情(你对$ master_filehandle什么都不做)。
更重要的是,你的例子创建并立即销毁fork对象,它们永远不会在循环中存活,你实际上在for循环中调用了循环函数,所以你可能不会多次循环
可能存在一些误解 - 你传递给运行的回调是在父进程中执行的,同样的进程是你执行AnyEvent :: Fork-> new,在子进程中运行的代码将是TargetUsers ::例如,工人职能。
要使计时器在新创建的进程中工作,您需要在其中运行事件循环。
使用异步后端的AnyEvent :: Fork :: RPC可能更适合你的情况:它为你运行一个事件循环,它有一个更简单的请求/响应用法,它可以传递数据到新创建的数据过程