zoukankan      html  css  js  c++  java
  • CAF(C++ Actor Framework)介绍

    原文链接:https://blog.csdn.net/woshiyuanlei/article/details/51276369

    1. 简述.


    caf是1个actor模型的开源编程框架,  强c++11风格的实现, 早先的名字其实不叫CAF, 而是CPPA. 改名的时间产生在版本(0.9 >> 0.10). 而最近的版本

    是0.11.2, 从文档上看, caf的实现参考了akka和erlang.  默许的actor调度是基于线程池方式, 而不是协程. 因此更像akka. 由于caf是基于c++的实现, 

    在性能上可能更占优势.  更让人没法谢绝的是在caf中大量使用了lambda表达式来替换通常散落1地的回调函数.  视觉上非常直观, 开发时可以少

    死很多脑细胞.  固然这个项目现在还非常新, 网络io部份也比较瘦, 养肥了再用到生产环境中不迟.


    2. caf的主要特性


    1. actor

    actor分为两种, 无类型actor和强类型actor. actor的创建非常简单, 简单到不能再简单了, 以下面的例子. 将1个自由函数作为参数传递spawn, 

    1个actor就生成了, 在下面的例子中actorx内部持有1个actor的句柄self. 所有与这个actor有关的消息都从这里开始.

     

    void actorx(event_based_actor* self) { } spawn(actorx);


    2. 模式匹配.

     

    模式匹配是caf中1个10分重要的特性, 它直接致使了caf基于lambda表达式的消息回调列表成为可能. caf为此自己内建了DSL语言来达成这个目的.

    下面效果就是来自模式匹配.

     

    void actorx(event_based_actor* self) { self->become( [=](const string& what) { LOG_DEBUG("got a string msg: %s ", what.c_str()) }, [=](const int& what) { LOG_DEBUG("got integer msg: %d ", what) }); } auto a = spawn(actorx); anon_send(a, "string"); /* 向actor发送1个字符串. */ anon_send(a, 0x10); /* 向actor发送1个整数. */

    需要说明的是, 上面的例子中actorx函数是立即返回的, 也就是说里面的become也是立即返回的,  好像把两个消息处理回调放在actorx函数内部.

     

    当有消息到来时, 经模式匹配后就会调用恰当的lambda表达式.  不用再到处找回调了.


    3. 消息发送.

    消息发送可以分为以下几种:

    a). 发完就忘, 就像上面anon_send.

    b). 同步发送, 等待响应. 等待是异步的, 相当于只是期待1个响应.

    c). 同步发送, 等待响应, 超时后收到1个系统消息.

    d). 同步发送, 同步等待. 适用阻塞的actor api.

    e). 消息延迟发送, 这1点比akka做得漂亮很多.

     f). 消息前转, forward.

    g). 消息优先级选择.


    4. 消息接收.

    主要有两种特性:

    a). 等待超时, 超时后收到1个系统消息.

    b). 消息跳过, skip.


    5. 行动(behavior)

    如果actor的消息流程是1个有限状态机, 那行动就是用来控制流程的标志. behavior是1个栈, 通过keep_behavior压栈, unbecome恢复.


    6.  链接(link)

    两个(或多个)actor可以相互link在1起, 生死相干. 1起活着或默许1起死去. 

    当其中1个actor异常退出时, 另外一个(多是多个)会收到1个"exit_msg"消息, 如果不捕获这个消息. 默许的行动就是当前actor也退出.

    如果选择捕获, 那就自己定义行动.


    7. 监视(monitor)

    1个actor可选择监视另外一个或另几个actor. 乃至可以同时监视同1个actor屡次. 当被监视的actor退出时, 监视者就会收到1个"down_msg". 

    监视者仅仅是收到这个消息而已. 不会有其它对自己的响应. 需自己定义行动. 


    8. 在网络上发布1个actor.

    这个功能貌似还非常骨感, 其做法是调用pubish函数将1个actor绑定在某个本地端口上, 作为服务器向外提供服务. 以下面的端口8080, 端口

    后面还有1个默许的字符串参数, 允许指定本地服务ip.

     

    auto a = spawn(actorx); publish(a, 8080); // actor r = remote_actor("127.0.0.1", 8080); anon_send(r, "information");

    上面的remote_actor则用于连上publish的actor, 这样散布在不同机器上的actor就能够相互通讯了. 这个功能似乎仅限于此了. 从实际的代码运

     

    行来看.  作为服务器的actor只能收到客户端发送的业务消息,  包括连接到来, 断开等事件都无消息通知. 并且双方之间的通讯似乎还遵守某种协

    议(自己写1个socket, 向服务器发送消息时, 它无动于中). 


    9. 代理(broker)
    broker的功能要比publish更强.  有点类似于我的前1篇博客中介绍的akka.io. 

    比akka有1点好的地方在是, broker提供了有限的手动控制消息缓冲区的api.  

    相信过不了多久. 用broker作服务器就会成为不错的选择.


    10.  组通讯.

    组可以分为匿名组, 本地组和远程组.  前两个用于进程内通讯, 远程组则可能合适1些散布式的利用场景. 1个actor可以加入或选择离开组. 


    3. 编译.


    项目地址是: https://github.com/actor-framework/actor-framework

    签出: git clone https://github.com/actor-framework/actor-framework.git 

    编译使用的是cmake, 进程很简单, 没甚么可说的.  编译完以后, 会生成两个库, libcaf_core.so和libcaf_io.so. 如果你不打算使用网络相干的功

    能, 只要链接上libcaf_core就能够了.


    4.  文档


    我翻译了1个libcaf的手册, 上传到百度文库了. 草稿, 无任何保证质量. 以下:

    http://wenku.baidu.com/view/7e2b6be16529647d2728528e.html

  • 相关阅读:
    Aptana 开发环境执行时默认的工作路径
    python 日志工具 Dict4ini 的简单使用示例
    C语言中的条件编译
    Ammyy Admin 一个小巧方便的远程管理工具
    djangoevolution 插件维持Django 模型和数据库结构一致的基本原理
    关于Django 框架的ContentType 模型
    关于 Django web请求中的Cookie
    GridView中,显示记录的总条数
    SQL 日期格式
    .net如何实现页面间的参数传递
  • 原文地址:https://www.cnblogs.com/SaraMoring/p/14512931.html
Copyright © 2011-2022 走看看