You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
package exegroup
|
|
|
|
|
|
|
|
import "context"
|
|
|
|
|
|
|
|
// Actor 是 [Group] 调度的执行单元;
|
|
|
|
//
|
|
|
|
// Actor.stopFunc 可以是 nil, 这时 Actor 需要受 goFunc 的 ctx 控制退出;
|
|
|
|
type Actor struct {
|
|
|
|
goFunc func(ctx context.Context) error
|
|
|
|
stopFunc func(ctx context.Context)
|
|
|
|
name string
|
|
|
|
}
|
|
|
|
|
|
|
|
// WithName 指定 [Actor] 的 name;
|
|
|
|
func (actor *Actor) WithName(name string) *Actor {
|
|
|
|
actor.name = name
|
|
|
|
return actor
|
|
|
|
}
|
|
|
|
|
|
|
|
// WithGo 指定 [Actor] 的 goFunc;
|
|
|
|
// 通过 WithGo 注册的 goFunc 函数应该受 ctx 控制退出;
|
|
|
|
func (actor *Actor) WithGo(goFunc func(ctx context.Context) error) *Actor {
|
|
|
|
actor.goFunc = goFunc
|
|
|
|
return actor
|
|
|
|
}
|
|
|
|
|
|
|
|
// WithGoStop 指定 [Actor] 的 goFunc 和 stopFunc;
|
|
|
|
// goFunc 不受 ctx 控制退出, 而是在 stopFunc 调用后退出;
|
|
|
|
// 1. goFunc 被 [Group] 在 goroutine 中启动;
|
|
|
|
// 2. stopFunc 在被 [Group] 启动的任意 goFunc 返回后被调用;
|
|
|
|
//
|
|
|
|
// 使用 stopFunc 可以在 stopFunc 的 ctx 中指定等待期限, 让 goFunc 延迟到等待期限强制退出;
|
|
|
|
func (actor *Actor) WithGoStop(goFunc func(ctx context.Context) error, stopFunc func(ctx context.Context)) *Actor {
|
|
|
|
actor.goFunc = goFunc
|
|
|
|
actor.stopFunc = stopFunc
|
|
|
|
return actor
|
|
|
|
}
|