假设我使用的是N个帐户对象。
我想为N帐户创建几个分支,并独立地包含一个事件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);
});
}); 此时,事件已经很好地启动了,但是我不得不等待最后一个事件的执行才能创建下一个叉。
你有什么想法吗?谢谢
发布于 2014-06-25 21:38:12
首先是一些观察:在您的示例中,您不需要调用->fork。您还没有显示分叉进程中运行的代码,您只展示了如何在父进程中创建计时器,并且这些定时器肯定会工作。最后,您似乎没有对分叉的进程做任何事情(您对$master_filehandle什么都不做)。
更重要的是,您的示例创建并立即销毁了叉对象,它们无法在循环中存活,而且实际上您在for循环中调用了循环函数,因此您可能不会重复循环一次。
可能涉及到一些误解--您传递给运行的回调是在父进程中执行的,与执行AnyEvent::叉->new的进程相同,在子进程中运行的代码将是TargetUsers::worker函数。
要使计时器在新创建的进程中工作,您需要在它们中运行一个事件循环。
也许AnyEvent::叉::RPC与异步后端更适合您的情况:它为您运行一个事件循环,它有一个更简单的请求/响应用法,并且可以向新创建的进程传递数据。
https://stackoverflow.com/questions/23761411
复制相似问题