https://github.com/daichitakahashi/workerctl
worker controller for graceful shutdown
https://github.com/daichitakahashi/workerctl
concurrency context go golang goroutine graceful-shutdown
Last synced: 3 months ago
JSON representation
worker controller for graceful shutdown
- Host: GitHub
- URL: https://github.com/daichitakahashi/workerctl
- Owner: daichitakahashi
- License: mit
- Created: 2021-04-30T00:31:24.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2022-03-01T02:18:44.000Z (over 3 years ago)
- Last Synced: 2025-04-07T00:27:28.270Z (7 months ago)
- Topics: concurrency, context, go, golang, goroutine, graceful-shutdown
- Language: Go
- Homepage:
- Size: 72.3 KB
- Stars: 6
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# workerctl: worker controller for graceful shutdown
[](https://pkg.go.dev/github.com/daichitakahashi/workerctl)
Package workerctl is controller of application's initialization and its graceful shutdown.
## Usage
```go
package mainimport (
"context"
"log"
"os"
"os/signal"
"syscall"
"time""github.com/daichitakahashi/workerctl"
)func main() {
ctx := context.Background()
a := &workerctl.Aborter{}
ctl, shutdown := workerctl.New()a.AbortOnError(func() (err error) {
// 1. Init shared resource and bind to this Controller.
// logOutput is used in both OneShotTaskRunner and Server.
logOutput, err := os.CreateTemp("", "*log")
if err != nil {
return err
}
ctl.Bind(logOutput)// 2. Start OneShotTaskRunner.
oneShot := &OneShotTaskRunner{
Writer: logOutput,
}
err = ctl.Launch(ctx, oneShot)
if err != nil {
return err
}{
// 3. Create Controller depends on ctl and start Server.
ctl := ctl.Dependent()server := &Server{
OneShot: oneShot,
Writer: logOutput,
}
err := ctl.Launch(ctx, server)
if err != nil {
return err
}
}
return nil
}())quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT)// Once SIGINT received or "/abort" requested, Controller starts shutdown.
// First, Server's graceful shutdown finished(3).
// Second, OneShotTaskRunner shutdown after all running task finished(2).
// Finally, logOutput will be closed(1).
select {
case <-a.Aborted():
log.Println("aborted")
case s := <-quit:
log.Println("signal received:", s)
}ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
defer cancel()
if err := shutdown(ctx); err != nil {
log.Fatal("Server forced to shutdown:", err)
}
}
```