【问题标题】:Perl AnyEvent concurrency internalsPerl AnyEvent 并发内部结构
【发布时间】:2014-02-03 20:43:00
【问题描述】:

我有一个服务器,它在每个客户端连接上创建一个“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 中有任何并发​​机制,那么回调不能同时执行,因为一个回调必须等到另一个回调完成数据库查找并且数据库句柄空闲。
附言感谢“ikegami”的回答。

【问题讨论】:

  • 如果您的问题得到解答,请勾选回答问题的答案旁边的标记,而不是在问题中添加感谢。欢迎使用 StackOverflow!
  • 礼貌地感谢您的参与。恕我直言,没有回答答案,您可以更具体地了解问题中提出的问题。而且我认为当有人感谢你时这样评论是不礼貌的(尤其是在你的第一反应是写评论而不是回答之后,即先自学)。
  • 啊,没注意到更新的那部分。
  • 这个问题没有添加任何实质内容。唯一提到的一个问题是如果有并发就会有一个问题,所以我不知道如何更具体地说没有并发。
  • 我不确定向网站的新手指出当他未能遵循预期行为时网站的运作方式有什么不礼貌的。 (1. 不希望在问题中包含感谢。2. 应使用适当的工具将问题标记为已回答,而不是感谢用户的回答。)

标签: perl anyevent event-based-programming


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      相关资源
      最近更新 更多