CAF(C++ actor framework)使用随笔(unbecome与keep_behavior用法)

看usermanual(使用随笔一里面有)看到差不多一半的时候,这个keep_behavior与unbeacome的结合引起了我的注意。(这是为什么呢?)

  因为它的示例代码写的太简单了!我真的没看太懂,我就自己把他的改了改放上来。

先讲一下,基本概念,就是一个actor可以有多个行为(behavior)那么become就可以让一个actor变成一种行为。

如果使用了keep_behavior呢就会把当前的行为压入“行为栈”(behavior stack),  调用unbecome就可以变成行为栈上最前面的一个了。

比如我先在行为A的时候keep_behavior,后来我再在行为B的时候keep_behavior一下,那么我此时调用unbecome的时候会变成哪个种行为呢?答案当然是行为B咯!

贴上代码

#include <string>
#include <iostream>
#include "caf/io/all.hpp"
#include "caf/all.hpp"
using namespace std;
using namespace caf;

behavior testee(event_based_actor* self) {
    return {
        [=](int value1) {
            cout<<"value1:"<<value1<<endl;
                self->become (
                keep_behavior,
                [=](float value2) {
                    cout << "value2:" << value2 << endl;
                        self->become (
                        keep_behavior,
                        [=](double value3){
                            cout<<"value3:"<<value3<<endl;
                            self->unbecome();
                        }
                    );
                    });
            }
        };
}

int main(){
    auto actor1 = spawn(testee);
    {
        caf::scoped_actor self;
        int a1 = 1;
        float a2 = 1.1;
        double a3 = 1.2;
        int b1 = 2;
        float b2 = 2.1;
        double b3 = 2.2;

        self->send(actor1,a1);
        self->send(actor1,a2);
        self->send(actor1,a3);
        self->send(actor1,b1);
        self->send(actor1,b2);
        self->send(actor1,b3);
    }
    caf::await_all_actors_done();
    shutdown();
    return 0;
}

结果为

如果把value2循环中的keep_behavior去掉结果就是

之后开始准备写caf序列化方面。真的是挺好用,挺炫酷。

最后弱弱的说一句,求互粉阿!

时间: 2024-10-06 20:17:21

CAF(C++ actor framework)使用随笔(unbecome与keep_behavior用法)的相关文章

CAF(C++ actor framework)使用随笔(projection 用法)(一)

最近干活在写毕设,用到了CAF,看了文档,发现了一些小坑,自己摸索写点随笔.(CAF的github网站 https://github.com/actor-framework/actor-framework)里面的example文件夹例子不错. 但是感觉其实实际使用还是会有很多没讲到. 概念的东西可以看http://www.wfuyu.com/mvc/21278.html 我学习就看着http://www.actor-framework.org/manual/看下去看着不太会的就写例子,第一个坑就

CAF(C++ actor framework)使用随笔(使用类去构建actor和使用的一些思路)

Class-based actorsA class-based actor is a subtype of event_based_actor and must implement the pure virtual member function make_behavior returning the initial behavior. 原话告诉我们两点:1.必须继承“ event_based_actor”. 2.重载make_behavior的函数,其实就是这个类的构造函数,定义了这个初始行为

CAF(C++ actor framework)使用随笔(各种send通信用法)(三)

c). 同步发送, 等待响应, 超时后收到1个系统消息. 贴上代码 #include <iostream> #include "caf/all.hpp" #include "caf/io/all.hpp" #include <string> #include <thread> #include <chrono> #include <unistd.h> using namespace std; using n

CAF(C++ actor framework)使用随笔(延迟发送,消息转发,消息优先级)(四)

e). 消息延迟发送(和前面没太大区别直接上代码) #include <iostream> #include "caf/all.hpp" #include "caf/io/all.hpp" #include <string> #include <chrono> using namespace std; using namespace caf; behavior fun(event_based_actor* self){ retur

CAF(C++ actor framework)(序列化之类,无需序列化,直接传)(二)

昨天讲了Struct,还是不够满意,毕竟C++里面类用的比较多嘛,那就先上个类,这段代码是我稍微改编了一下的结果. #include <utility> #include <iostream> #include <vector> #include "caf/all.hpp" using std::cout; using std::endl; using std::make_pair; using std::vector; using namespac

“幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】

刘德华 有一首歌叫<马桶>,其中有一句歌词是:每一个马桶都是英雄. EFCore也有一个英雄,在幕后默默地任劳任怨.它就叫 "支持字段" (Backing Fields): 中文版:https://docs.microsoft.com/zh-cn/ef/core/modeling/backing-field 支持字段允许 EF 读取和/或写入字段而不是一个属性. 在类中的封装用于限制的使用和/或增强围绕访问数据的语义由应用程序代码,但值应进行读取和/或写入到数据库而无需使用

用actor model实现intel tbb这样的用法

关于什么事actor model,什么事intel tbb这样的用法我就不详细说了,具体请上网查文档 class MyActor { F f; MyActor inputs[]; MyActor outputs[]; int n; #internal void run() { f(); for o in outputs: sendMsg(o, this) } ##1 void addOutput(o) { outputs.append(o); } ##2 void onFirstRun() {

Akka(6): become/unbecome:运算行为切换

通过一段时间的学习了解,加深了一些对Akka的认识,特别是对于Akka在实际编程中的用途方面.我的想法,或者我希望利用Akka来达到的目的是这样的:作为传统方式编程的老兵,我们已经习惯了直线流程方式一口气实现完整的功能.如果使用Akka,我们可以把这个完整的功能分切成多个能产生中间临时结果的小功能然后把这些功能放到不同的Actor上分别独立运算,再通过消息来连接这些功能集合成最终结果.如此我们就轻易得到了一个多线程并发程序.由于Akka是软件工具(Tool),没有软件架构(Framework)对

并发运算lib

最近对类似于erlang或者golang的并发运算很感兴趣.以下是看到的相关资料. libgo c++,技术:协程,多线程.这是俺发现的用法最漂亮的c++库,用法参考golang CAF 全称c++ actor framework,用线程池做任务调度,貌似不支持协程,所以写code用了很多回调的写法 其他协程库   如libtask, libco, boost::coroutine, libto,  libco,libcopp. SimpleActorModel 俺自己写了一个actor mod