easyworker (module github.com/manhvu/easyworker/v2) is a redesigned worker
runtime for Go. It provides explicit outcomes, owned lifecycles, joinable
shutdown, and separate retry and restart policies.
This version uses a clean architecture layout:
domain: types, policies, outcomes, errors, and logging contractsruntime: supervisor, task, stream, and future orchestrationadapter/reflect: reflection binding and validationadapter/slog: structured logging adapter- root package: public API facade
Requires Go 1.24 or newer.
ctx := context.Background()
sup, err := easyworker.NewSupervisor(ctx, easyworker.SupervisorOptions{})
if err != nil {
log.Fatal(err)
}
defer sup.Stop(ctx)
child, err := sup.Spawn(easyworker.ChildSpec{
Job: easyworker.MustReflect(poll, 5),
Restart: easyworker.RestartPolicy{Mode: easyworker.RestartOnFailure},
})
if err != nil {
log.Fatal(err)
}
_ = childGuides live in docs/:
- Supervision
- Batch execution
- Stream execution
- Async execution
- Cancellation
- Retry and restart
- Logging
- Errors
Runnable samples live in examples/:
go run ./examples/supervisorgo run ./examples/taskgo run ./examples/streamgo run ./examples/async
Use the structured logging adapter:
import (
"log/slog"
easylog "github.com/manhvu/easyworker/v2/adapter/slog"
)
sup, err := easyworker.NewSupervisor(ctx, easyworker.SupervisorOptions{
Logger: easylog.New(slog.Default()),
})NewSupervisor()becomesNewSupervisor(ctx, opts).NewChildplusAddChildbecomesSupervisor.Spawn.Stop,Done, andRemoveSupervisorbecomeStop(ctx)andDone().NewConfigandNewTaskbecomeTaskOptionsandRunTask.NewStreambecomesNewStream[In, Out].NewGoandMonitorbecomeAsyncandFuture.- Global
EnableLogbecomes per-instanceLogger. GetSupervisor(id)is removed; capture handles directly.
MustReflect is a convenience wrapper around ReflectJob that panics on
invalid construction. Use ReflectJob when construction errors must be
handled.
EOF