亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Go語言同步與異步執行多個任務封裝詳解(Runner和RunnerAsync)

2020-04-01 18:59:32
字體:
來源:轉載
供稿:網友

前言

同步適合多個連續執行的,每一步的執行依賴于上一步操作,異步執行則和任務執行順序無關(如從10個站點抓取數據)

同步執行類RunnerAsync

支持返回超時檢測,系統中斷檢測

錯誤常量定義

//超時錯誤var ErrTimeout = errors.New("received timeout")//操作系統系統中斷錯誤var ErrInterrupt = errors.New("received interrupt")

實現代碼如下

package taskimport ( "os" "time" "os/signal" "sync") //異步執行任務type Runner struct { //操作系統的信號檢測 interrupt chan os.Signal //記錄執行完成的狀態 complete chan error //超時檢測 timeout <-chan time.Time //保存所有要執行的任務,順序執行 tasks []func(id int) error waitGroup sync.WaitGroup lock sync.Mutex errs []error} //new一個Runner對象func NewRunner(d time.Duration) *Runner { return &Runner{ interrupt: make(chan os.Signal, 1), complete: make(chan error), timeout: time.After(d), waitGroup: sync.WaitGroup{}, lock: sync.Mutex{}, }} //添加一個任務func (this *Runner) Add(tasks ...func(id int) error) { this.tasks = append(this.tasks, tasks...)} //啟動Runner,監聽錯誤信息func (this *Runner) Start() error { //接收操作系統信號 signal.Notify(this.interrupt, os.Interrupt) //并發執行任務 go func() { this.complete <- this.Run() }() select { //返回執行結果 case err := <-this.complete: return err //超時返回 case <-this.timeout: return ErrTimeout }} //異步執行所有的任務func (this *Runner) Run() error { for id, task := range this.tasks { if this.gotInterrupt() {  return ErrInterrupt } this.waitGroup.Add(1) go func(id int) {  this.lock.Lock()  //執行任務  err := task(id)  //加鎖保存到結果集中  this.errs = append(this.errs, err)   this.lock.Unlock()  this.waitGroup.Done() }(id) } this.waitGroup.Wait()  return nil} //判斷是否接收到操作系統中斷信號func (this *Runner) gotInterrupt() bool { select { case <-this.interrupt: //停止接收別的信號 signal.Stop(this.interrupt) return true //正常執行 default: return false }} //獲取執行完的errorfunc (this *Runner) GetErrs() []error { return this.errs}

使用方法    

Add添加一個任務,任務為接收int類型的一個閉包

Start開始執行傷,返回一個error類型,nil為執行完畢, ErrTimeout代表執行超時,ErrInterrupt代表執行被中斷(類似Ctrl + C操作)

測試示例代碼

package taskimport ( "testing" "time" "fmt" "os" "runtime") func TestRunnerAsync_Start(t *testing.T) { //開啟多核 runtime.GOMAXPROCS(runtime.NumCPU()) //創建runner對象,設置超時時間 runner := NewRunnerAsync(8 * time.Second) //添加運行的任務 runner.Add( createTaskAsync(), createTaskAsync(), createTaskAsync(), createTaskAsync(), createTaskAsync(), createTaskAsync(), createTaskAsync(), createTaskAsync(), createTaskAsync(), createTaskAsync(), createTaskAsync(), createTaskAsync(), createTaskAsync(), ) fmt.Println("同步執行任務") //開始執行任務 if err := runner.Start(); err != nil { switch err { case ErrTimeout:  fmt.Println("執行超時")  os.Exit(1) case ErrInterrupt:  fmt.Println("任務被中斷")  os.Exit(2) } } t.Log("執行結束")} //創建要執行的任務func createTaskAsync() func(id int) { return func(id int) { fmt.Printf("正在執行%v個任務/n", id) //模擬任務執行,sleep兩秒 //time.Sleep(1 * time.Second) }}

執行結果  

同步執行任務正在執行0個任務正在執行1個任務正在執行2個任務正在執行3個任務正在執行4個任務正在執行5個任務正在執行6個任務正在執行7個任務正在執行8個任務正在執行9個任務正在執行10個任務正在執行11個任務正在執行12個任務 runnerAsync_test.go:49: 執行結束

異步執行類Runner

支持返回超時檢測,系統中斷檢測

實現代碼如下

package taskimport ( "os" "time" "os/signal" "sync") //異步執行任務type Runner struct { //操作系統的信號檢測 interrupt chan os.Signal //記錄執行完成的狀態 complete chan error //超時檢測 timeout <-chan time.Time //保存所有要執行的任務,順序執行 tasks []func(id int) error waitGroup sync.WaitGroup lock sync.Mutex errs []error} //new一個Runner對象func NewRunner(d time.Duration) *Runner { return &Runner{  interrupt: make(chan os.Signal, 1),  complete: make(chan error),  timeout: time.After(d),  waitGroup: sync.WaitGroup{},  lock:  sync.Mutex{}, }} //添加一個任務func (this *Runner) Add(tasks ...func(id int) error) { this.tasks = append(this.tasks, tasks...)} //啟動Runner,監聽錯誤信息func (this *Runner) Start() error { //接收操作系統信號 signal.Notify(this.interrupt, os.Interrupt) //并發執行任務 go func() {  this.complete <- this.Run() }() select { //返回執行結果 case err := <-this.complete:  return err  //超時返回 case <-this.timeout:  return ErrTimeout }} //異步執行所有的任務func (this *Runner) Run() error { for id, task := range this.tasks {  if this.gotInterrupt() {   return ErrInterrupt  }  this.waitGroup.Add(1)  go func(id int) {   this.lock.Lock()   //執行任務   err := task(id)   //加鎖保存到結果集中   this.errs = append(this.errs, err)   this.lock.Unlock()   this.waitGroup.Done()  }(id) } this.waitGroup.Wait() return nil} //判斷是否接收到操作系統中斷信號func (this *Runner) gotInterrupt() bool { select { case <-this.interrupt:  //停止接收別的信號  signal.Stop(this.interrupt)  return true  //正常執行 default:  return false }} //獲取執行完的errorfunc (this *Runner) GetErrs() []error { return this.errs}

使用方法    

Add添加一個任務,任務為接收int類型,返回類型error的一個閉包

Start開始執行傷,返回一個error類型,nil為執行完畢, ErrTimeout代表執行超時,ErrInterrupt代表執行被中斷(類似Ctrl + C操作)

getErrs獲取所有的任務執行結果

測試示例代碼

package taskimport ( "testing" "time" "fmt" "os" "runtime") func TestRunner_Start(t *testing.T) { //開啟多核心 runtime.GOMAXPROCS(runtime.NumCPU()) //創建runner對象,設置超時時間 runner := NewRunner(18 * time.Second) //添加運行的任務 runner.Add(  createTask(),  createTask(),  createTask(),  createTask(),  createTask(),  createTask(),  createTask(),  createTask(),  createTask(),  createTask(),  createTask(),  createTask(),  createTask(),  createTask(), ) fmt.Println("異步執行任務") //開始執行任務 if err := runner.Start(); err != nil {  switch err {  case ErrTimeout:   fmt.Println("執行超時")   os.Exit(1)  case ErrInterrupt:   fmt.Println("任務被中斷")   os.Exit(2)  } } t.Log("執行結束") t.Log(runner.GetErrs())} //創建要執行的任務func createTask() func(id int) error { return func(id int) error {  fmt.Printf("正在執行%v個任務/n", id)  //模擬任務執行,sleep  //time.Sleep(1 * time.Second)  return nil }}

執行結果

異步執行任務正在執行2個任務正在執行1個任務正在執行4個任務正在執行3個任務正在執行6個任務正在執行5個任務正在執行9個任務正在執行7個任務正在執行10個任務正在執行13個任務正在執行8個任務正在執行11個任務正在執行12個任務正在執行0個任務 runner_test.go:49: 執行結束 runner_test.go:51: [<nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil> <nil>]

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
啊v视频在线一区二区三区| 亚洲精品免费一区二区三区| 亚洲精品在线视频| 国产精品爽黄69天堂a| 美日韩精品免费视频| 久久婷婷国产麻豆91天堂| 欧美日韩免费区域视频在线观看| 青青草原成人在线视频| 亚洲欧美日韩国产精品| 在线视频欧美日韩| 1769国产精品| 日韩电影大片中文字幕| 亚洲偷欧美偷国内偷| 欧美一区二区三区精品电影| 亚洲成人教育av| 国产成人精品电影| 中文字幕亚洲字幕| 亚洲午夜未满十八勿入免费观看全集| 亚洲大胆人体在线| 91亚洲人电影| 97不卡在线视频| 欧美另类高清videos| 91在线观看免费| 亚洲精品aⅴ中文字幕乱码| 国产精品pans私拍| 欧美视频第一页| 精品亚洲一区二区三区| 九九久久综合网站| 欧美高清视频在线| 在线观看亚洲视频| 日韩在线视频国产| 亚洲电影免费观看高清| 亚洲国产天堂久久综合网| 97超级碰碰碰久久久| 亚洲国产精品久久91精品| 高清一区二区三区四区五区| 国内久久久精品| 国产成人精品一区二区三区| 欧美精品电影免费在线观看| 亚洲男人av在线| 欧美整片在线观看| 欧美日在线观看| 国产亚洲人成网站在线观看| 久久免费国产精品1| 国产精品久久久久久久天堂| 亚洲精品自拍视频| 亚洲精品白浆高清久久久久久| 欧美人在线视频| 国产97人人超碰caoprom| 亚洲91av视频| 欧美精品激情视频| 2019中文在线观看| 国产精品久久久久久久久借妻| 亚洲性xxxx| 日韩av免费观影| 成人免费网站在线看| 色在人av网站天堂精品| 国产精品天天狠天天看| 国产日产欧美精品| 97超碰蝌蚪网人人做人人爽| 日韩第一页在线| 久久久成人精品视频| 成人国产精品一区| 欧美猛男性生活免费| 国产亚洲美女精品久久久| 亚洲成色777777女色窝| 日韩在线视频观看| 日韩欧美黄色动漫| 成人妇女免费播放久久久| 精品日本美女福利在线观看| 亚洲天堂网站在线观看视频| 日本高清+成人网在线观看| 色视频www在线播放国产成人| 精品国内产的精品视频在线观看| 在线观看国产精品日韩av| 国产精品视频永久免费播放| 国产精品扒开腿做爽爽爽视频| 91高清在线免费观看| 韩剧1988在线观看免费完整版| 欧美黑人狂野猛交老妇| 国自在线精品视频| 韩国福利视频一区| 精品亚洲男同gayvideo网站| 日韩成人在线电影网| 国产精品福利网站| 亚洲欧美一区二区三区四区| 欧美中文字幕在线观看| 欧美性猛交xxxx| 国产精品日韩电影| 欧美午夜性色大片在线观看| 欧美中文字幕精品| 欧美最猛黑人xxxx黑人猛叫黄| 在线观看国产成人av片| 国内外成人免费激情在线视频| 久久视频免费在线播放| 91精品91久久久久久| 成人国内精品久久久久一区| 国精产品一区一区三区有限在线| 韩国国内大量揄拍精品视频| 日韩av影片在线观看| 亚洲性生活视频在线观看| 91探花福利精品国产自产在线| 777午夜精品福利在线观看| 91精品视频免费| 欧美尺度大的性做爰视频| 欧美激情欧美激情在线五月| 欧美日韩免费区域视频在线观看| 懂色av中文一区二区三区天美| 久久久久国色av免费观看性色| 欧美午夜激情小视频| xvideos成人免费中文版| 欧美性猛交xxxx乱大交3| 成人免费视频xnxx.com| 国产免费久久av| 7m精品福利视频导航| 菠萝蜜影院一区二区免费| 狠狠久久亚洲欧美专区| 欧美乱大交xxxxx| 国产精品av免费在线观看| 成人午夜激情免费视频| 亚洲一区二区三区香蕉| 亚洲乱码av中文一区二区| 精品国内亚洲在观看18黄| 国产成人高清激情视频在线观看| 久久精品视频中文字幕| 久久99青青精品免费观看| 精品亚洲永久免费精品| 国产99久久久欧美黑人| 欧美在线视频a| 国产精品久久久久久久午夜| 98精品国产高清在线xxxx天堂| 欧美国产日本在线| 主播福利视频一区| 国产区精品视频| 精品视频在线导航| 97久久伊人激情网| 欧美黄色片视频| 亚洲第一av网| 久热99视频在线观看| 影音先锋日韩有码| 亚洲一区二区三区xxx视频| 中文字幕亚洲图片| 亚洲专区国产精品| 精品久久久久久久久久久久| 亚洲自拍欧美另类| 国产精品久久久久久久久粉嫩av| 国产一级揄自揄精品视频| 在线看福利67194| 精品久久久久久中文字幕大豆网| 亚洲欧美国产精品va在线观看| 日韩高清免费观看| 国产精品欧美一区二区三区奶水| 69视频在线免费观看| 亚洲综合在线中文字幕| 久久免费福利视频| 亚洲一区二区免费| 国产91对白在线播放| 91最新在线免费观看| 日韩久久免费视频| 国产精品99久久久久久白浆小说| 亚洲欧美精品一区| 日韩理论片久久| 全亚洲最色的网站在线观看| 日韩免费电影在线观看|