基于rust实现的事件系统,方便程序解耦

wd_event

简介

事件系统是受到c#的启发,基于事件系统可以更容易地实现程序解耦。
因此,用rust也实现了一个类似的、但更丰富的轻量级事件开发包。
crate地址:https://crates.io/crates/wd_event
git地址:https://gitee.com/yutiandou/wd-event

功能
  • 事件注册和调用(废话)
  • Context 上下文
  • delay event,delay cycle event,定时任务和循环任务
  • task pool 任务池
  • object pool 对象池(暂时没用)
用法
导包
use wd_event::{EventManage,EConfig,Context,Event,EType,AsyncEvent};
创建一个事件管理器
fn main() {
    let mut es = EventManage::new(EConfig::default());
    //TODO ...
}

#[tokio::main]
async fn main() {
    let mut es = EventManage::new_async(EConfig::default()).await;
    //TODO ...
}
注册事件

任何一个实现了Event 特性的类型的实体都可以被注册。事件类型如下三种

  • EType::Default: 执行 Event 特性的 handle 方法.
  • EType::Mutable: 执行 Event 特性的 handle_mut 方法.
  • EType::Async: 异步事件,添加异步事件时自动调用。

sync

struct HandleOne;
impl Event for HandleOne{
    fn handle(&self,_ctx:Arc<Context>){
        println!("execute handlone handle")
    }
}

let event_one = String::from("event_one");
es.add( event_one.clone(),HandleOne{},EType::Default).unwrap();

async 注意:一个异步事件是不能被exec_sequence函数顺序执行的

struct AsyncHanle;
#[wd_event::event_trait]
impl AsyncEvent for AsyncHanle{
    async fn handle(&self,_ctx:Arc<Context>){
        tokio::time::sleep(Duration::from_secs(1)).await;
        println!("休眠一秒后执行");
    }
}

es.add_async(event_one.clone(),AsyncHanle{}).unwrap();
执行事件 ,都是非阻塞的
  • exec_sequence: 按顺序执行一个事件,先注册先执行
  • exec_pool: 将事件发送到任务池中执行
  • exec_immediately: 立即异步执行事件
es.exec_sequence(&event_one,None);
es.exec_pool(&event_one,None);
es.exec_immediately(&event_one,None).await;;
上下文

上下文用于在对事件的多个回调中传递状态和共享消息。

更改上下文的状态将停止后续的函数调用,只有exec_sequence方法和循环事件才会停止。

更多方法请参考API。

//Create context and add a default message
let a:i32 = 1;
es.exec_sequence(&event_one,Some(Context::new_add_msg(a)));

//Gets the default message for the context
impl Event for HandleOne{
    fn handle(&self,ctx:Arc<Context>){
        let value = match ctx.get_msg::<i32>(){
            Some(s)=>{
                s.add(10)
            }
            None=>{0}
        };
        println!("execute handlone handle,get value {}",value);
    }
}
//

定时事件和循环事件
//delay event and cycle event. only the handle_mut method is called
fn handle_mut(&mut self,ctx:Arc<Context>){
    let a = match ctx.get_arc_value::<String,i32>(&self.key){
        Some(s)=>{
            s.add(1)}
        None=>{0}
    };
    println!("循环{}次",a);
    ctx.set_value(&self.key, a);
}
//Once a second
es.delay_exec(Cycle{key:"default".to_string()},Context::new_delay(std::time::Duration::from_secs(1),true));
任务池

任务池功能,集成到事件管理器中。使用exec_pool函数。
当然,也可以单独使用任务池函数,详见API。

对象池

对象池,目前只是一个简单的实现。
值得考虑的是,rust是否真的需要对象池?

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值