成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一個 Demo 學會 WorkerPool

開發 前端
工作池是這樣一個池子,會創建指定數量的 worker,這些 worker 能獲取任務并處理。允許多個任務同時處理,但是需要維持固定數量的 worker 避免系統資源被過度使用。

[[413973]]

本文轉載自微信公眾號「Golang來啦」,作者Seekload。轉載本文請聯系Golang來啦公眾號。

四哥水平有限,如有翻譯或理解錯誤,煩請幫忙指出,感謝!

今天給大家分享一篇關于 workPool 的文章,這個平時大家應該用的比較多,一起來看下。

原文如下:

工作池是這樣一個池子,會創建指定數量的 worker,這些 worker 能獲取任務并處理。允許多個任務同時處理,但是需要維持固定數量的 worker 避免系統資源被過度使用。

通常有兩種方式創建任務池:

  • 一種是預先創建固定數量的 worker;
  • 另外一種是當有需要的時候才會創建 worker,當然也會有數量限制;

本文將與大家一起討論第一種方式。當我們預先知道有許多任務需要同時運行,并且很大概率會用上最大數量的 worker,通常會采用這種方式。

為了演示,我們先創建 Worker 結構體,它獲取任務并執行。

  1. import ( 
  2.  "fmt" 
  3.  
  4. // Worker ... 
  5. type Worker struct { 
  6.  ID       int 
  7.  Name     string 
  8.  StopChan chan bool 
  9.  
  10. // Start ... 
  11. func (w *Worker) Start(jobQueue chan Job) { 
  12.  w.StopChan = make(chan bool) 
  13.  successChan := make(chan bool) 
  14.  
  15.  go func() { 
  16.   successChan <- true 
  17.   for { 
  18.    // take job 
  19.    job := <-jobQueue 
  20.    if job != nil { 
  21.     job.Start(w) 
  22.    } else { 
  23.     fmt.Printf("worker %s to be stopped\n", w.Name
  24.     w.StopChan <- true 
  25.     break 
  26.    } 
  27.   } 
  28.  }() 
  29.  
  30.  // wait for the worker to start 
  31.  <-successChan 
  32.  
  33. // Stop ... 
  34. func (w *Worker) Stop() { 
  35.  // wait for the worker to stop, blocking 
  36.  _ = <-w.StopChan 
  37.  fmt.Printf("worker %s stopped\n", w.Name

Worker 有一些屬性保存當前的狀態,另外還聲明了兩個方法分別用于啟動、停止 worker。

在 Start() 方法里,創建了兩個 channel 分別用于 worker 的啟動和停止。最重要的是 for 循環里面,worker 會一直等待獲取 job 并可執行的直到任務隊列關閉。

Job 是包含單個方法 Start() 的接口,所以只要實現 Start() 方法就可以有不同類型的 job。

  1. // Job ... 
  2. type Job interface { 
  3.  Start(worker *Worker) error 

一旦 Worker 確定之后,接下來就是創建 pool 來管理 workers。

  1. import ( 
  2.  "fmt" 
  3.  "sync" 
  4.  
  5. // Pool ... 
  6. type Pool struct { 
  7.  Name string 
  8.  
  9.  Size    int 
  10.  Workers []*Worker 
  11.  
  12.  QueueSize int 
  13.  Queue     chan Job 
  14.  
  15. // Initiualize ... 
  16. func (p *Pool) Initialize() { 
  17.  // maintain minimum 1 worker 
  18.  if p.Size < 1 { 
  19.   p.Size = 1 
  20.  } 
  21.  p.Workers = []*Worker{} 
  22.  for i := 1; i <= p.Size; i++ { 
  23.   worker := &Worker{ 
  24.    ID:   i - 1, 
  25.    Name: fmt.Sprintf("%s-worker-%d", p.Name, i-1), 
  26.   } 
  27.   p.Workers = append(p.Workers, worker) 
  28.  } 
  29.  
  30.  // maintain min queue size as 1 
  31.  if p.QueueSize < 1 { 
  32.   p.QueueSize = 1 
  33.  } 
  34.  p.Queue = make(chan Job, p.QueueSize) 
  35.  
  36. // Start ... 
  37. func (p *Pool) Start() { 
  38.  for _, worker := range p.Workers { 
  39.   worker.Start(p.Queue) 
  40.  } 
  41.  fmt.Println("all workers started"
  42.  
  43. // Stop ... 
  44. func (p *Pool) Stop() { 
  45.  close(p.Queue) // close the queue channel 
  46.  
  47.  var wg sync.WaitGroup 
  48.  for _, worker := range p.Workers { 
  49.   wg.Add(1) 
  50.   go func(w *Worker) { 
  51.    defer wg.Done() 
  52.  
  53.    w.Stop() 
  54.   }(worker) 
  55.  } 
  56.  wg.Wait() 
  57.  fmt.Println("all workers stopped"

Pool 包含 worker 切片和用于保存 job 的隊列。worker 的數量在初始化的時候是可以自定義。

關鍵點在 Stop() 的邏輯,當它被調用時,會先關閉 job 隊列,worker 便會從 job 隊列讀到 nil,接著就會關閉對應的 worker。接著在 for 循環里,等待 worker 并發地停止直到最后一個 worker 停止。

為了演示整體邏輯,下面的例子展示了一個僅僅輸出值的 job。

  1. import "fmt" 
  2.  
  3. func main() { 
  4.  pool := &Pool{ 
  5.   Name:      "test"
  6.   Size:      5, 
  7.   QueueSize: 20, 
  8.  } 
  9.  pool.Initialize() 
  10.  pool.Start() 
  11.         defer pool.Stop() 
  12.  
  13.  for i := 1; i <= 100; i++ { 
  14.   job := &PrintJob{ 
  15.    Index: i, 
  16.   } 
  17.   pool.Queue <- job 
  18.  } 
  19.  
  20. // PrintJob ... 
  21. type PrintJob struct { 
  22.  Index int 
  23.  
  24. func (pj *PrintJob) Start(worker *Worker) error { 
  25.  fmt.Printf("job %s - %d\n", worker.Name, pj.Index
  26.  return nil 

如果你看了上面的代碼邏輯,就會發現很簡單,創建了有 5 個 worker 的工作池并且 job 隊列的大小是 20。

接著,模擬 job 創建和處理過程:一旦 job 被創建就會 push 到任務隊列里,等待著的 worker 便會從隊列里取出 job 并處理。

類似下面這樣的輸出:

  1. all workers started 
  2. job test-worker-3 - 4 
  3. job test-worker-3 - 6 
  4. job test-worker-3 - 7 
  5. job test-worker-3 - 8 
  6. job test-worker-3 - 9 
  7. job test-worker-3 - 10 
  8. job test-worker-3 - 11 
  9. job test-worker-3 - 12 
  10. job test-worker-3 - 13 
  11. job test-worker-3 - 14 
  12. job test-worker-3 - 15 
  13. job test-worker-3 - 16 
  14. job test-worker-3 - 17 
  15. job test-worker-3 - 18 
  16. job test-worker-3 - 19 
  17. job test-worker-3 - 20 
  18. worker test-worker-3 to be stopped 
  19. job test-worker-4 - 5 
  20. job test-worker-0 - 1 
  21. worker test-worker-3 stopped 
  22. job test-worker-2 - 3 
  23. worker test-worker-2 to be stopped 
  24. worker test-worker-2 stopped 
  25. worker test-worker-4 to be stopped 
  26. worker test-worker-4 stopped 
  27. worker test-worker-0 to be stopped 
  28. worker test-worker-0 stopped 
  29. job test-worker-1 - 2 
  30. worker test-worker-1 to be stopped 
  31. worker test-worker-1 stopped 
  32. all workers stopped 

via:https://www.pixelstech.net/article/1611483826-Demo-on-creating-worker-pool-in-GoLang

作者:sonic0002

 

責任編輯:武曉燕 來源: Golang來啦
相關推薦

2021-07-26 10:14:38

Go語言工具

2024-08-21 08:21:45

CNN算法神經網絡

2024-08-02 10:28:13

算法NLP模型

2024-07-19 08:21:24

2024-12-19 00:16:43

2024-06-06 09:44:33

2024-06-03 08:09:39

2024-09-09 23:04:04

2015-03-30 12:20:07

DemoStoryboard

2024-08-29 09:18:55

2024-08-22 08:24:51

算法CNN深度學習

2024-11-11 00:00:02

卷積神經網絡算法

2024-12-04 10:33:17

2021-03-09 17:09:42

拷貝算法對象

2011-07-22 16:29:53

IOS Demo CD

2023-03-26 22:02:53

APMPR監控

2024-06-21 08:15:25

2024-06-19 09:47:21

2021-10-04 09:29:41

對象池線程池

2020-04-10 10:15:29

算法開源Github
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天爽综合网 | 亚洲精品一区二区在线观看 | 中文字幕在线视频网站 | 日韩在线一区二区 | 毛片久久久 | 久久久久国产一区二区三区不卡 | 久草视频观看 | 在线免费观看亚洲 | 亚洲综合中文字幕在线观看 | www.99热.com | 色综合一区二区三区 | 欧美性生活网 | 免费成人午夜 | 青青草原精品99久久精品66 | 国产精彩视频一区 | 一本一道久久a久久精品综合蜜臀 | 国产色婷婷精品综合在线播放 | 国产伦精品一区二区三区四区视频 | 国产成人久久精品一区二区三区 | 久久久久久成人 | 欧美v日韩| 天堂av资源 | 亚洲成人午夜电影 | 黄网站色大毛片 | 成人免费视频一区二区 | 国产视频三级 | 欧美精品在线免费观看 | 免费观看日韩av | 日韩欧美中文字幕在线观看 | 国产一区在线免费观看 | 免费在线日韩 | 一区二区三区四区在线视频 | 日韩在线免费观看视频 | 中文字幕一区二区三区四区五区 | 亚洲国产精品久久久久久 | 北条麻妃视频在线观看 | 亚洲精品18 | 精品综合 | 日韩欧美专区 | 一区二区三区国产 | 欧美成人激情 |