gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:42:13 24 4
gpt4 key购买 nike

假设我使用 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-> 计时器,我在其中创建了我的 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);

});
});

此时事件已经很好地启动了,但我必须等待上一个事件的执行才能创建下一个 fork 。

请问您有什么想法吗?谢谢

最佳答案

首先是一些观察:在您的示例中,您不需要调用 ->fork。您也没有显示在 fork 进程中运行的代码,您只显示了如何在父进程中创建计时器,这些当然应该有效。最后,您似乎没有对 fork 进程执行任何操作(您对 $master_filehandle 没有执行任何操作)。

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

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

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

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

关于perl - 我可以在 AnyEvent::Fork 中使用 AnyEvent->timer() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23761411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com