gopkg.in/simversity/gottp.v3@v3.0.0-20160401065405-576cf030ca0e/worker.go (about) 1 package gottp 2 3 import ( 4 "log" 5 "sync" 6 "time" 7 ) 8 9 var worker func(chan bool) 10 11 var errChan = make(chan bool) 12 13 var exitChan = make(chan bool, 1) 14 15 var wg = new(sync.WaitGroup) 16 17 func spawner() { 18 go workerWrapper() 19 20 _, ok := <-errChan 21 if !ok { 22 log.Println("Timing out in 10 seconds") 23 time.Sleep(10 * time.Second) 24 wg.Done() 25 return 26 } 27 28 go spawner() 29 } 30 31 func workerWrapper() { 32 wg.Add(1) 33 defer wg.Done() 34 35 // Trusing the fact that Tracer will always execute callback. 36 defer Tracer.Notify(func(reason string) string { 37 errChan <- true 38 return "Exception in worker: " + reason 39 }) 40 41 worker(exitChan) 42 } 43 44 func RunWorker(wk func(chan bool)) { 45 if worker != nil { 46 panic("Worker already running.") 47 } 48 worker = wk 49 go spawner() 50 } 51 52 func shutdownWorker() { 53 if worker == nil { 54 return 55 } 56 57 log.Println("Preparing for shutdown") 58 exitChan <- true 59 close(errChan) 60 wg.Wait() 61 }