Go实现控制任程序的生命周期
2017-04-23 23:49
483 查看
runner/runner.go:
runner/main/main.go:
package runner import ( "errors" "os" "os/signal" "time" ) type Runner struct { interrupt chan os.Signal complete chan error timeout <-chan time.Time tasks []func(int) } var ErrTimeout = errors.New("received timeout") var ErrInterrupt = errors.New("received interrupt") func New(d time.Duration) *Runner { return &Runner{ interrupt: make(chan os.Signal, 1), complete: make(chan error), timeout: time.After(d), } } func (r *Runner) Add(tasks ...func(int)){ r.tasks = append(r.tasks, tasks...) } func (r *Runner) Start() error { signal.Notify(r.interrupt, os.Interrupt) go func() { r.complete <- r.run() }() select { case err := <-r.complete: return err case <-r.timeout: return ErrTimeout } } func (r *Runner) run() error { for id, task := range r.tasks { if r.gotInterrupt() { return ErrInterrupt } task(id) } return nil } func (r *Runner) gotInterrupt() bool { select { case <-r.interrupt: signal.Stop(r.interrupt) return true default: return false } }
runner/main/main.go:
package main import ( "log" "time" "os" "runner" ) const timeout = 3 * time.Second func main(){ log.Println("Starting work.") r := runner.New(timeout) r.Add(createTask(), createTask(), createTask()) if err := r.Start(); err != nil { switch err { case runner.ErrTimeout: log.Println("Terminating due to timeout.") os.Exit(1) case runner.ErrInterrupt: log.Println("Terminating due to interrupt.") os.Exit(2) } log.Println("Process ended.") } } func createTask() func(int) { return func(id int){ log.Printf("Processor - Task #%d.", id) time.Sleep(time.Duration(id) * time.Second) } }
相关文章推荐
- JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期、多线程程序练习、安全问题的解决
- 热点_C#实现蜘蛛_爬虫程序的多线程控制
- 用VC++实现控制程序运行一实例
- .NET多线程编程(14)——用C#实现蜘蛛/爬虫程序的多线程控制
- Android 绑定Service 实现android控制service的生命周期
- IE的安全設置中設成“啟用,運行,下载activeX控件”程序控制的实现的原理
- 在程序中实现远程访问控制
- 控制Android系统 全屏并且 程序开机自动运行 并且实现程序运行中 开机不锁屏
- 如何用程序实现对IE中scripts的控制(禁止和允许)
- 用C#实现蜘蛛/爬虫程序的多线程控制
- AVR+FPGA实现六路闭环电流控制程序
- 实现系统托盘程序控制
- 在VC++实现控制程序只运行唯一一个实例
- 用C#实现蜘蛛/爬虫程序的多线程控制
- 用C#实现蜘蛛/爬虫程序的多线程控制(1)
- QT实现跨平远程控制程序
- 实现asp程序调用摄像头并控制摄像头进行拍照
- 利用程序的返回值实现控制台程序的界面控制
- 通过 Mutex/Semaphore 实现程序进程实例的控制
- AVR+FPGA实现六路闭环电流控制程序