actix rust actor 框架学习 二 ping actor demo 代码

以下是官方文档的学习,了解基本的actix actor 编程模型

项目初始化

  • cargo 创建
cargo new actor-ping --bin
  • 效果
├── Cargo.toml
└── src
    └── main.rs

添加依赖

  • cargo.toml 配置
[package]
name = "actor-ping"
version = "0.1.0"
authors = ["rongfengliang <[email protected]>"]
edition = "2018"
?
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
?
[dependencies]
actix = "0.8"
?

创建Actor trait

  • actor 代码
use actix::prelude::*;
?
struct MyActor {
    count: usize,
}
?
impl Actor for MyActor {
    type Context = Context<Self>;
}

说明
每个actor 必须有一个context,后边会有介绍

定义消息

消息是actor 可以接受的数据,消息是任何实现Message trait 的类型

use actix::prelude::*;
?
struct Ping(usize);
?
impl Message for Ping {
    type Result = usize;
}

定义消息的handler

handler 是能处理对应消息实现了Handler trait 的方法

impl Handler<Ping> for MyActor {
    type Result = usize;
?
    fn handle(&mut self, msg: Ping, _ctx: &mut Context<Self>) -> Self::Result {
        self.count += msg.0;
?
        self.count
    }
}

启动actor 以及处理效果

启动actor 依赖context,上边demo 使用的Context依赖的基于tokio/future 的context
所以可以使用Actor::start()或者Actor::create(),我们可以使用do_send 发送不需要等待响应
的消息,或者使用send 发送特定消息,start() 以及creat() 都返回一个adress 对象

fn main() -> std::io::Result<()> {
    let system = System::new("test");
?
    // start new actor
    let addr = MyActor{count: 10}.start();
?
    // send message and get future for result
    let res = addr.send(Ping(10));
?
    Arbiter::spawn(
        res.map(|res| {
            println!("RESULT: {}", res == 20);
        })
        .map_err(|_| ()));
?
    system.run()
}

运行&&效果

  • 运行
cargo run
  • 效果

参考资料

https://actix.rs/book/actix/sec-1-getting-started.html

原文地址:https://www.cnblogs.com/rongfengliang/p/12209108.html

时间: 2024-10-10 00:33:37

actix rust actor 框架学习 二 ping actor demo 代码的相关文章

Struts2框架学习(二) Action

Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器拦截请求,创建代理Action对象,执行方法,返回结果,界面跳转. 拦截器解析请求路径,获取Action的名称,到配置文件中查找action的完整类名,利用反射创建对象. 每请求一次,就创建一个对象,所以action是多例的,也是线程安全的. 2,关系 请求的路径和配置文件的对应关系: 配置文件中包

Android Afinal框架学习(二) FinalActivity 一个IOC框架

框架地址:https://github.com/yangfuhai/afinal 对应的源码: net.tsz.afinal.annotation.view.* FinalActivity FinalActivity是一个基础类,结合注解实现了,依赖注入(view的资源id,常用的监听器), 利用set方式注入 完全注解方式就可以进行UI绑定和事件绑定,无需findViewById和set event Listener 这个过程:initInjectedView>findViewById.set

Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...

PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框...   AndBase中AbActivity封装好了许多方法提供我们去使用,使得在使用的时候更加的方便,只需要传递相关参数即可..省去了我们自己使用基础的函数进行构造...   就好比进度框,Toast框,弹出框,确认框...这些基本的东西都在AndBase的AbActivity封装好了...我们只需要传递参数调用其中内部的方法就可以完成这些视

laravel框架学习(二)

在了解Laravel框架的基本结构之后,初步认识访问过程中路由的使用方法,以一套基本的学生信息增删改查来迅速学习框架开发. 首先了解几个目录文件作为开发的主要阵地: 1. /app/Http/routes.php 路由文件,一切访问从路由开始 2./app/Http/Controllers 控制器目录,我们写的控制器都放在该目录下 3./app/config Laravel配置文件夹一般修改.env文件 4./.env 经常修改配置的文件,数据库配置就在这里 5./public Laravel框

Hibernate框架学习(二)——api详解

一.Configuration对象 功能:配置加载类,用于加载主配置,orm元数据加载. 1 //1.创建,调用空参构造(还没有读配置文件) 2 Configuration conf=new Configuration(); 3 //2.读取指令配置文件=>空参加载方法,加载src下的hibernate.cfg.xml文件 4 conf.configure(); 5 6 //3.读取指定orm元数据(扩展),如果主配置中已经引入映射配置,不需要手动加载 7 //conf.addResource(

TP框架学习(二)

简单的增删改查 1 1.创建一个index.php文件 2 定义应用App目录名 3 导入窗口入口文件 4 开启调试模式//出现错误会报告出错的详细信息 5 define("APP_DEBUG",true);//上线时要关闭的 6 2.前端后台 7 App内Home复制一份,重命名Admin后台模块 8 如果有手机端可再复制一份Api模块 9 3.修改Admin/Controller/IndexController.class.php文件 10 namespace Admin\Cont

Castle ActiveRecord框架学习(二):快速搭建简单博客网站

一.数据库 1.数据表 Category:类别标签表(字段Type=1为类别,Type=2为标签) Category_Post:类别标签与文章中间表 Post:文章表 Comment:评论表 2.数据库关系图 3.简单说明 Category和Post表为多对多关系 Post和Comment表 为一对多关系 二.实体类 1.Category类: // 指定数据表,Lazy为延迟加载 [ActiveRecord("Category",Lazy=true)] public class Cat

bottle框架学习(二)之HTTP请求

HTTP 请求方法 HTTP 协议有很多种请求方法.route默认使用GET方法,只响应GET请求.method参数可以给route()函数指定使用哪种方法.或用get(),post(),put()或delete()等函数来代替route()函数. POST 方法一般用于HTML 表单的提交.下面是一个使用POST 来实现用户登录的例子: [[email protected]]# cat login.py #!/usr/bin/envpython #coding=utf-8 from bottl

[Laravel框架学习二]:Laravel的CURD和查询构造器的CURD,以及聚合函数

1 public function index() 2 { 3 4 //return Member::getMember();//这是调用模型的方法 5 6 return view('lpc',[ 7 'age'=>18, 8 'name'=>'PengchongLee', 9 ]); 10 } 11 public function test()//一个方法得设置一个路由 12 { 13 //echo 1;//测试路由 14 15 //新增数据 16 //$data = DB::insert(