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.
crate/exegroup/actor.go

38 lines
1.2 KiB
Go

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
}