Help us shape the future of Go! Take the 2026 Go Developer Survey

apprun

package
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 3, 2026 License: Apache-2.0 Imports: 12 Imported by: 0

Documentation

Overview

Package apprun 提供实例式常驻服务监督、统一停收和并行排空,依赖标准库与 logit。 Manager 零值默认 30 秒,New 可设置整个停收与排空期限。 Stop 只封闭入口,Wait(ctx) 等待实际工作与收尾,Cancel 必须立即发出取消通知并返回。 全部回调必填,停收可先于 Run;未停收时 Run 返回 nil 视为 ErrUnexpectedExit。

以 HTTP 为例(需导入 context、errors、net/http、time、apprun 和 httpserver):

server, err := httpserver.New(httpserver.Config{
	Addr: ":8888",
}, http.NotFoundHandler())
if err != nil {
	return err
}
var manager apprun.Manager
if err := manager.Register(apprun.Service{
	Name: "http",
	Run: func() error {
		err := server.Run()
		if errors.Is(err, httpserver.ErrClosed) {
			return nil
		}
		return err
	},
	Stop: server.Stop,
	Wait: server.Wait,
	Cancel: server.Cancel,
}); err != nil {
	_ = server.Stop()
	server.Cancel()
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	return errors.Join(err, server.Wait(ctx))
}
return manager.RunSignals()

Run 的 context 只通知停机,不提前取消业务。收到信号、取消或服务退出后,向全部服务发起 Stop, 并行等待 Wait 与 Run;同一截止时间从停机开始计算,不逐组件重置。已接收的队列工作属于存量。 错误与 panic 保留;超时返回 ErrShutdownTimeout 并取消未完成服务,不再等待业务响应。 Wait 返回错误或 panic 时按未确认排空处理,返回前 Cancel 兜底;超时错误包含未完成服务名与关闭阶段。 无论是否超时,入口随后调用资源栈回收;lifecycle.Stack 默认整体 20 秒,可通过 New 自定义。 资源回收超时须立即退出进程;本包不接管资源栈或调用 os.Exit,不能强杀 goroutine。 登记顺序不提供服务就绪或停机依赖保证;已停收的业务消费者不保证接收在途任务发出的新请求。 RunSignals 订阅 SIGINT/SIGTERM,首次停机后恢复原信号行为;应用只应有一个信号所有者。 SIGKILL/SIGSTOP 不可捕获,SIGHUP/SIGQUIT 保持原行为。回调不得同步等待 Manager.Run 或使用 runtime.Goexit。

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrStarted          = errors.New("apprun: manager already started")
	ErrNilContext       = errors.New("apprun: nil context")
	ErrNoServices       = errors.New("apprun: no services registered")
	ErrInvalidService   = errors.New("apprun: invalid service")
	ErrDuplicateService = errors.New("apprun: duplicate service name")
	ErrUnexpectedExit   = errors.New("apprun: service exited before shutdown")
	// ErrShutdownTimeout 表示统一停收与排空期限耗尽;尚未结束的回调可能继续执行。
	ErrShutdownTimeout = errors.New("apprun: shutdown timeout")
)

Functions

This section is empty.

Types

type Manager

type Manager struct {
	// contains filtered or unexported fields
}

Manager 并发运行常驻服务,统一停收并并行排空。零值可用,使用后不可复制。 自定义关闭期限须通过 New 设置,创建后不可修改。 登记顺序不代表启动依赖或停机顺序;登记成功的服务由本次 Run 负责停收。

func New

func New(shutdownTimeout time.Duration) (*Manager, error)

New 创建管理器并固定总关闭期限;零值默认 30 秒,负值返回错误。

func (*Manager) Register

func (m *Manager) Register(service Service) error

Register 登记名称唯一的服务;运行开始后不能追加登记。

func (*Manager) Run

func (m *Manager) Run(ctx context.Context) error

Run 等待 ctx 取消或任一服务退出,统一停收并在同一个期限内等待全部服务排空。 ctx 只通知管理器,不提前取消业务;预取消也会停收已登记服务,但不启动 Run。 超时通知未完成服务 Cancel 并返回 ErrShutdownTimeout;入口随后有界回收资源并退出。

func (*Manager) RunSignals

func (m *Manager) RunSignals() error

RunSignals 使用内部后台 context 显式订阅 SIGINT/SIGTERM,收到信号后按 Run 的协议关闭服务。 首次停机时恢复原有信号行为,使后续中断可直接终止进程;应用只应有一个信号所有者。 不接管 SIGKILL/SIGSTOP;信号处理不覆盖调用前的配置加载和初始化。

type PanicError

type PanicError struct {
	Service   string
	Operation string
	Value     any
	Stack     []byte
}

PanicError 保存运行或关闭回调的 panic;保留堆栈并通过返回错误交给调用方。

func (*PanicError) Error

func (e *PanicError) Error() string

type Service

type Service struct {
	Name   string
	Run    func() error
	Stop   func() error
	Wait   func(context.Context) error
	Cancel func()
}

Service 描述常驻服务,全部回调必填。Stop 只封闭入口并启动排空,Wait 等待实际工作结束。 Wait 返回 nil 才确认排空;错误或 panic 保留,管理器返回前仍会调用 Cancel 兜底。 Cancel 只发出协作取消通知,必须立即返回;超时不保证任意 Go 任务已经终止。 Stop/Cancel 可先于或并发于 Run,停收后 Run 不得重新启动。Run 不得只启动后台任务就返回。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL