Golang Go语言中的gookit/event - 轻量级事件管理、调度程序库

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


Golang Go语言中的gookit/event - 轻量级事件管理、调度程序库

更多关于Golang Go语言中的gookit/event - 轻量级事件管理、调度程序库的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

感觉写 go 的真牛 x ,各种库信手拈来

更多关于Golang Go语言中的gookit/event - 轻量级事件管理、调度程序库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go 有啥牛 X 的,这不就是个观察者模式

关于Golang中gookit/event这一轻量级事件管理、调度程序库,以下是我的专业回复:

gookit/event是一个基于Go语言设计的事件驱动框架,它提供了简洁明了的方式管理和触发应用程序中的事件。该库支持事件监听、发布订阅模式,使得解耦不同组件间的交互变得轻而易举。

gookit/event的核心优势在于:

  • 功能丰富:支持自定义事件对象、为单个事件添加多个监听器、设置事件监听器的优先级,以及基于事件名称前缀的监听器集合等功能。
  • 高效灵活:支持异步触发事件,通过go通道消费者实现事件的异步处理,提升系统性能。
  • 易于集成:可以与诸如Gin Web框架、数据库访问库等其他Go生态系统中的工具集成,以增强应用程序的事件响应能力。

在实际应用中,gookit/event可广泛应用于日志记录、权限验证、消息通知等多个场景,特别是在微服务架构中,它能够为各个服务之间构建非直接调用的通信桥梁,减少服务之间的紧耦合。

总之,gookit/event以其简洁的API设计、高效的事件调度机制和丰富的功能,为Go应用的事件处理提供了强大支持。无论是新手还是经验丰富的Go程序员,都可以轻松上手并从中受益。

回到顶部