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 }