123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package main
- import (
- "context"
- "fmt"
- lazyquiter "git.swzry.com/zry/go-lazy-quiter"
- tombv2 "gopkg.in/tomb.v2"
- "math/rand"
- "os"
- "time"
- )
- func main() {
- lq := lazyquiter.NewLazyQuiter()
- quitch := make(chan error, 0)
- tt := NewTask()
- tt.Start()
- go func() {
- lq.Wait()
- fmt.Println("[tomb-test-2023-0124-1301] stop task.")
- err := tt.Stop()
- quitch <- err
- }()
- fmt.Println("[tomb-test-2023-0124-1301] main thread wait for done.")
- err := <-quitch
- if err != nil {
- fmt.Println("[tomb-test-2023-0124-1301] main thread end with error:", err)
- } else {
- fmt.Println("[tomb-test-2023-0124-1301] main thread end with no error.")
- }
- }
- type TombedTask struct {
- tomb *tombv2.Tomb
- ctx context.Context
- }
- func NewTask() *TombedTask {
- tt := &TombedTask{}
- t, ctx := tombv2.WithContext(context.Background())
- tt.tomb = t
- tt.ctx = ctx
- return tt
- }
- func (t *TombedTask) task() error {
- pid := os.Getpid()
- tstr := time.Now().Format(time.RFC3339Nano)
- LabelLoop:
- for {
- fmt.Printf("[tomb-test-2023-0124-1301] pid=%d\ttime=%s\n", pid, tstr)
- jitter := rand.Int31n(1000)
- sltime := time.Duration(jitter+1000) * time.Millisecond
- time.Sleep(sltime)
- select {
- case <-t.tomb.Dying():
- {
- break LabelLoop
- }
- default:
- continue LabelLoop
- }
- }
- fmt.Println("[tomb-test-2023-0124-1301] printing task end.")
- return nil
- }
- func (t *TombedTask) Start() {
- t.tomb.Go(t.task)
- }
- func (t *TombedTask) Stop() error {
- t.tomb.Kill(nil)
- return t.tomb.Wait()
- }
|