-1

我有一个服务器,它在每个客户端连接上创建一个“AnyEvent 计时器”观察者对象(将其添加到 AnyEvent 循环中)。

use AnyEvent;

...

my $db_handle = myschema->connect();

my $w; $w = AnyEvent->timer (
       interval => $interval,
       after    => $interval,
       cb => sub {
          ## Remove from loop on some condition
          unless ( $ret = _check_session($sid) ) {
             undef $w;
          }

          ## Execute main logic
          $db_handle->lookup($sid);
       }
);

...

所以回调将每 $interval 秒执行一次。如果有很多客户端,则必须同时执行一些回调。AnyEvent 如何处理这个问题?它是一个接一个地执行这些回调还是在这种情况下有一些并发机制,以便这些回调将同时执行?(例如,通过创建多个线程来加速必须同时执行的多个回调的执行)
在我的服务器的情况下,回调执行数据库查找。数据库连接的数据库句柄已在事件循环之外初始化。我担心的是,如果 AnyEvent 中有任何并发​​机制,那么回调不能同时执行,因为一个回调必须等到另一个回调完成数据库查找并且数据库句柄空闲。
PS感谢'ikegami'的回答。

4

2 回答 2

3

AnyEvent 不会创建任何并发。当您调用它时它会处理事件(例如->recv)。

于 2014-01-15T13:58:02.113 回答
0

正如 ikegami 所说 - AnyEvent 中没有并发。任何事件循环都使您能够“异步”处理事件 - 因此您可以同时进行多个请求/操作/计时器,而无需同时执行代码。事件总是按顺序处理。

对于您的多个计时器同时到期的特定情况 - 每个计时器依次处理(它们按到期时间排序),并且所有“到期”计时器在每次事件循环迭代时处理 - 例如 Loop 的第 208-213 行.pm 用于您可以查看@CPAN 的纯 Perl 实现。

于 2015-06-22T15:28:49.237 回答