gookit/event - Go 实现的轻量级的事件管理、调度程序库 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
jxia
V2EX    Go 编程语言

gookit/event - Go 实现的轻量级的事件管理、调度程序库

  •  
  •   jxia 2023-06-19 16:54:08 +08:00 1730 次点击
    这是一个创建于 923 天前的主题,其中的信息可能已经有所发展或是发生改变。

    gookit/event Go 实现的轻量级的事件管理、调度程序库, 支持设置监听器的优先级, 支持使用通配符来进行一组事件的监听。

    功能简介

    • 支持自定义创建预定义的事件对象
    • 支持对一个事件添加多个监听器
    • 支持设置事件监听器的优先级,优先级越高越先触发
    • 支持通过通配符 * 来进行一组事件的匹配监听.
      • ModeSimple - 注册 app.db.* 事件的监听,触发 app.db.run app.db.end 时,都将同时会触发 app.db.* 监听器
      • ModePath - NEW * 只匹配一段非 . 的字符,可以进行更精细的监听; ** 匹配任意多个字符,只能用于开头或结尾
    • 支持直接使用通配符 * 来监听全部事件的触发
    • 支持触发事件时投递到 chan, 异步进行消费处理. 触发方法: Async(), FireAsync()
    • 完善的单元测试,单元覆盖率 > 95%

    安装

    go get github.com/gookit/event 

    主要方法

    • On/Listen(name string, listener Listener, priority ...int) 注册事件监听
    • Subscribe/AddSubscriber(sbr Subscriber) 订阅,支持注册多个事件监听
    • Trigger/Fire(name string, params M) (error, Event) 触发事件
    • MustTrigger/MustFire(name string, params M) Event 触发事件,有错误则会 panic
    • FireEvent(e Event) (err error) 根据给定的事件实例,触发事件
    • FireBatch(es ...interface{}) (ers []error) 一次触发多个事件
    • Async/FireC(name string, params M) 触发投递事件到 chan,异步消费处理
    • FireAsync(e Event) 触发投递事件到 chan,异步消费处理
    • AsyncFire(e Event) 简单的通过 go 异步触发事件

    快速使用

    package main import ( "fmt" "github.com/gookit/event" ) func main() { // 注册事件监听器 event.On("evt1", event.ListenerFunc(func(e event.Event) error { fmt.Printf("handle event: %s\n", e.Name()) return nil }), event.Normal) // 注册多个监听器 event.On("evt1", event.ListenerFunc(func(e event.Event) error { fmt.Printf("handle event: %s\n", e.Name()) return nil }), event.High) // ... ... // 触发事件 // 注意:第二个监听器的优先级更高,所以它会先被执行 event.MustFire("evt1", event.M{"arg0": "val0", "arg1": "val1"}) } 

    Note: 注意:第二个监听器的优先级更高,所以它会先被执行

    异步消费事件

    可以使用 Async/FireC/FireAsync 方法触发事件,事件将会写入 chan 异步消费。可以使用 CloseWait() 关闭 chan 并等待事件全部消费完成。

    新增配置选项:

    • ChannelSize 设置 chan 的缓冲大小
    • ConsumerNum 设置启动多少个协程来消费事件
    func main() { // 注意:在程序退出时关闭事件 chan defer event.Close() // defer event.CloseWait() // 注册事件监听器 event.On("app.evt1", event.ListenerFunc(func(e event.Event) error { fmt.Printf("handle event: %s\n", e.Name()) return nil }), event.Normal) // 注册多个监听器 event.On("app.evt1", event.ListenerFunc(func(e event.Event) error { fmt.Printf("handle event: %s\n", e.Name()) return nil }), event.High) // ... ... // 异步消费事件 event.FireC("app.evt1", event.M{"arg0": "val0", "arg1": "val1"}) } 

    Note: 应当在程序退出时关闭事件 chan. 可以使用下面的方法:

    • event.Close() 立即关闭 chan 不再接受新的事件
    • event.CloseWait() 关闭 chan 并等待所有事件处理完成

    更多

    更多使用说明请看 README

    2 条回复    2023-06-20 14:47:16 +08:00
    ruanimal
        1
    ruanimal  
       2023-06-20 11:34:17 +08:00
    感觉写 go 的真牛 x ,各种库信手拈来
    bv
        2
    bv  
       2023-06-20 14:47:16 +08:00
    @ruanimal Go 有啥牛 X 的,这不就是个观察者模式
    关于     帮助文档     自助推广系统 &nbs;   博客     API     FAQ     Solana     5386 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 07:56 PVG 15:56 LAX 23:56 JFK 02:56
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86