golang轻量级可插拔事件循环与定时器依赖注入插件库anagent的使用
Golang轻量级可插拔事件循环与定时器依赖注入插件库anagent的使用
Anagent是一个轻量级的Golang库,它提供了可插拔的事件循环和定时器处理功能,并支持依赖注入。它基于codegangsta/inject、go-macaron/inject和chuckpreslar/emission库构建。
事件发射器与依赖注入
下面是一个使用依赖注入的示例:
package main
import (
"log"
"github.com/mudler/anagent"
)
type TestTest struct {
Test string
}
func main() {
agent := anagent.New()
mytest := &TestTest{Test: "PONG!"}
agent.Map(mytest) // 将mytest实例映射到agent中
// 注册一次性事件处理器,可以访问注入的依赖
agent.Once("test", func(te *TestTest, l *log.Logger) {
if te.Test == "PONG!" {
l.Println("It just works!")
}
})
agent.Emit("test") // 触发事件
}
在这个例子中,我们通过agent.Map()
将TestTest
结构体实例映射到agent中,所有触发的事件处理器都可以访问这些依赖。
定时器/反应器
下面是一个使用定时器的示例:
package main
import "github.com/mudler/anagent"
import "fmt"
type TestTest struct {
Test string
}
func main() {
agent := anagent.New()
mytest := &TestTest{Test: "PONG!"}
agent.Map(mytest)
// 注册事件处理器
agent.Emitter().On("test", func(s string) { fmt.Println("Received: " + s) })
// 设置一个3秒的非循环定时器
agent.TimerSeconds(int64(3), false, func(a *anagent.Anagent, te *TestTest) {
a.Emitter().Emit("test", te.Test) // 触发事件
go a.Stop() // 停止事件循环
})
agent.Start() // 启动事件循环,将在此处阻塞
}
这段代码会启动并等待3秒,然后执行回调函数(非循环,因此第二个参数为false
),触发之前定义的自定义事件。注意这里直接通过agent.Emitter()
访问发射器,而不是使用依赖注入功能。
集成到其他事件循环
我们可以将anagent集成到其他框架的事件循环中:
package main
import "github.com/mudler/anagent"
import "fmt"
type TestTest struct {
Test string
}
func main() {
agent := anagent.New()
mytest := &TestTest{Test: "PONG!"}
agent.Map(mytest)
// 注册事件处理器,延迟2秒响应
agent.Emitter().On("test", func(s string) {
agent.TimerSeconds(int64(2), false, func() {
fmt.Println("Received: " + s)
})
})
// 设置一个3秒的循环定时器
agent.TimerSeconds(int64(3), true, func(a *anagent.Anagent, te *TestTest) {
fmt.Println("PING!")
a.Emitter().Emit("test", te.Test)
})
for { // 无限循环
agent.Step() // 手动执行一步事件处理
}
}
在这个例子中,我们创建了一个3秒的循环定时器,每次触发时会打印"PING!"并发射"test"事件。事件处理器会延迟2秒后打印接收到的消息。通过调用agent.Step()
,我们可以将anagent集成到自己的事件循环中。
更多关于golang轻量级可插拔事件循环与定时器依赖注入插件库anagent的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang轻量级可插拔事件循环与定时器依赖注入插件库anagent的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang轻量级事件循环与定时器插件库anagent使用指南
anagent是一个轻量级的Golang库,提供了事件循环和定时器功能,支持依赖注入和插件机制。下面我将详细介绍它的使用方法。
安装
go get github.com/mudler/anagent
基本用法
1. 创建Agent实例
package main
import (
"github.com/mudler/anagent"
"log"
"time"
)
func main() {
agent := anagent.New()
// 这里添加事件处理器或定时器
// 启动事件循环
agent.Start()
}
2. 添加定时任务
// 每5秒执行一次
agent.TimerSeconds(5, func(a *anagent.Anagent) {
log.Println("定时任务执行 - 每5秒")
})
// 每1分钟执行一次
agent.TimerMinutes(1, func(a *anagent.Anagent) {
log.Println("定时任务执行 - 每1分钟")
})
// 一次性延迟任务(3秒后执行)
agent.Timeout(time.Second*3, func(a *anagent.Anagent) {
log.Println("延迟任务执行 - 3秒后")
})
3. 自定义定时器
// 自定义间隔的定时器
ticker := time.NewTicker(2 * time.Second)
agent.AddTimer(ticker, func(a *anagent.Anagent) bool {
log.Println("自定义定时器执行 - 每2秒")
return true // 返回true表示继续执行,false表示停止
})
4. 事件处理
// 注册事件处理器
agent.On("event.name", func(a *anagent.Anagent) {
log.Println("收到事件: event.name")
})
// 触发事件
agent.Emit("event.name")
5. 依赖注入
type MyService struct {
Name string
}
func main() {
agent := anagent.New()
// 注入依赖
agent.Map(&MyService{Name: "TestService"})
agent.TimerSeconds(1, func(a *anagent.Anagent) {
// 获取依赖
var service *MyService
a.Get(&service)
log.Println("服务名称:", service.Name)
})
agent.Start()
}
插件开发示例
anagent支持插件机制,可以方便地扩展功能:
type MyPlugin struct{}
func (p *MyPlugin) Name() string {
return "MyPlugin"
}
func (p *MyPlugin) OnLoad(agent *anagent.Anagent) error {
log.Println("插件加载:", p.Name())
agent.TimerSeconds(10, func(a *anagent.Anagent) {
log.Println("插件定时任务执行")
})
return nil
}
func main() {
agent := anagent.New()
agent.Plugin(&MyPlugin{})
agent.Start()
}
高级特性
1. 中间件
agent.Use(func(next anagent.Handler) anagent.Handler {
return func(a *anagent.Anagent) {
start := time.Now()
next(a)
log.Printf("处理耗时: %v", time.Since(start))
}
})
2. 优雅关闭
go func() {
time.Sleep(10 * time.Second)
agent.Stop() // 停止事件循环
}()
agent.Start()
3. 共享数据
// 设置共享数据
agent.Set("key", "value")
// 获取共享数据
if val, ok := agent.Get("key").(string); ok {
log.Println("共享数据:", val)
}
实际应用示例
package main
import (
"github.com/mudler/anagent"
"log"
"time"
)
type AppConfig struct {
Interval time.Duration
Message string
}
func main() {
agent := anagent.New()
// 注入配置
config := &AppConfig{
Interval: time.Second * 2,
Message: "Hello from anagent!",
}
agent.Map(config)
// 定时任务
agent.Timer(config.Interval, func(a *anagent.Anagent) {
var cfg *AppConfig
a.Get(&cfg)
log.Println(cfg.Message)
})
// 模拟外部事件
go func() {
time.Sleep(5 * time.Second)
agent.Emit("shutdown")
}()
// 事件处理
agent.On("shutdown", func(a *anagent.Anagent) {
log.Println("收到关闭事件,准备退出...")
a.Stop()
})
// 启动
log.Println("应用启动")
agent.Start()
log.Println("应用退出")
}
总结
anagent提供了以下核心功能:
- 轻量级事件循环
- 灵活的定时器支持
- 依赖注入容器
- 插件机制
- 中间件支持
它非常适合需要事件驱动、定时任务或插件化架构的Golang应用程序,相比其他框架更加轻量且易于集成。