【问题标题】:Message receive for c++ actor systemc++ 演员系统的消息接收
【发布时间】:2015-06-19 06:45:38
【问题描述】:

我正在尝试在 C++ 中为参与者实现消息处理。 scala中的以下代码是我试图在c++中实现的东西

def receive = {
    case Message1 =>{/* logic code */}
    case Message2 =>{/* logic code */}
 } 

因此,我们的想法是为各种消息类型创建一组处理函数,并创建一个调度方法来将消息路由到其适当的消息处理程序。所有消息都将扩展基本消息类型。

解决这个问题的最佳方法是什么:

  1. 维护一个Map(Message_type, function_pointer),dispatch方法会检查map并调用相应的方法。但是,此映射需要在 Actor 类中手动完成。

  2. 我读到了这个library,图书馆正在按照我想要的方式处理消息,但我不明白他们如何在第 56 行创建的 lambda 函数上进行模式匹配。

如果有任何建议或阅读链接可以让我更接近这个问题的解决方案,我将不胜感激。

【问题讨论】:

  • 如果您正在查看像 #1 这样的解决方案,您刚刚描述了虚拟表。除非您想使用像您向我们展示的那个库那样性感且难以辨认的东西,否则您为什么不注册侦听器来处理您的消息?您将获得地图和函数指针。

标签: c++ c++11 lambda actor messages


【解决方案1】:

既然您已经提到了 CAF:为什么要实现自己的演员库而不是使用 CAF?如果您将编写库作为练习,我建议您开始阅读libcaf_core/caf/match_case.hpplibcaf_core/caf/on.hpplibcaf_core/caf/detail/try_match.hpp。这是 CAF 模式匹配工具的“核心”。请注意,您将看到很多元编程代码。该代码旨在由 C++ 专家阅读。这绝对不是学习技术的好地方。

不过,我可以概述正在发生的事情。

  • CAF 将模式存储为match_case 对象的列表detail::behavior_impl
    • 作为用户,您永远不会获得指向其中任何一个的指针
    • message_handlerbehavior 存储指向 behavior_impl 的指针
  • 可以以不同的方式生成匹配案例:
    • 直接来自回调/lambdas(平凡的案例)
    • 使用包罗万象的规则(通过others >> ...
    • 使用高级on(...) >> ... 表示法
  • CAF 只能匹配存储在message 对象中的元组
    • “模拟”(一个子集)反射
    • 需要值和元信息(即类型信息)
  • 对于匹配本身,CAF 简单地遍历match_case 对象列表
    • 尝试将输入与每种情况匹配
    • 在第一次匹配时停止(就像函数式语言一样)

我们在模式匹配实现方面投入了大量精力,以在用户端获得高级且干净的界面。不过,这并不容易。因此,如果您将此作为练习进行,请注意您需要大量元编程经验才能理解代码。

如果您将此作为练习,我很想知道您为什么认为 CAF 不涵盖您的用例,也许我们可以说服您参与其开发而不是开发从头开始的其他东西。 ;)

【讨论】:

    【解决方案2】:

    尝试使用sobjectizer(包括电池)或rotor(仍处于试验阶段,但相当轻量级的actor-like解决方案)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-05
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 2012-11-05
      • 2015-02-22
      相关资源
      最近更新 更多