国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一個(gè) Demo 學(xué)會(huì) WorkerPool

開(kāi)發(fā) 前端
工作池是這樣一個(gè)池子,會(huì)創(chuàng)建指定數(shù)量的 worker,這些 worker 能獲取任務(wù)并處理。允許多個(gè)任務(wù)同時(shí)處理,但是需要維持固定數(shù)量的 worker 避免系統(tǒng)資源被過(guò)度使用。

[[413973]]

本文轉(zhuǎn)載自微信公眾號(hào)「Golang來(lái)啦」,作者Seekload。轉(zhuǎn)載本文請(qǐng)聯(lián)系Golang來(lái)啦公眾號(hào)。

四哥水平有限,如有翻譯或理解錯(cuò)誤,煩請(qǐng)幫忙指出,感謝!

今天給大家分享一篇關(guān)于 workPool 的文章,這個(gè)平時(shí)大家應(yīng)該用的比較多,一起來(lái)看下。

原文如下:

工作池是這樣一個(gè)池子,會(huì)創(chuàng)建指定數(shù)量的 worker,這些 worker 能獲取任務(wù)并處理。允許多個(gè)任務(wù)同時(shí)處理,但是需要維持固定數(shù)量的 worker 避免系統(tǒng)資源被過(guò)度使用。

通常有兩種方式創(chuàng)建任務(wù)池:

  • 一種是預(yù)先創(chuàng)建固定數(shù)量的 worker;
  • 另外一種是當(dāng)有需要的時(shí)候才會(huì)創(chuàng)建 worker,當(dāng)然也會(huì)有數(shù)量限制;

本文將與大家一起討論第一種方式。當(dāng)我們預(yù)先知道有許多任務(wù)需要同時(shí)運(yùn)行,并且很大概率會(huì)用上最大數(shù)量的 worker,通常會(huì)采用這種方式。

為了演示,我們先創(chuàng)建 Worker 結(jié)構(gòu)體,它獲取任務(wù)并執(zhí)行。

  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 有一些屬性保存當(dāng)前的狀態(tài),另外還聲明了兩個(gè)方法分別用于啟動(dòng)、停止 worker。

在 Start() 方法里,創(chuàng)建了兩個(gè) channel 分別用于 worker 的啟動(dòng)和停止。最重要的是 for 循環(huán)里面,worker 會(huì)一直等待獲取 job 并可執(zhí)行的直到任務(wù)隊(duì)列關(guān)閉。

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

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

一旦 Worker 確定之后,接下來(lái)就是創(chuàng)建 pool 來(lái)管理 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 的隊(duì)列。worker 的數(shù)量在初始化的時(shí)候是可以自定義。

關(guān)鍵點(diǎn)在 Stop() 的邏輯,當(dāng)它被調(diào)用時(shí),會(huì)先關(guān)閉 job 隊(duì)列,worker 便會(huì)從 job 隊(duì)列讀到 nil,接著就會(huì)關(guān)閉對(duì)應(yīng)的 worker。接著在 for 循環(huán)里,等待 worker 并發(fā)地停止直到最后一個(gè) worker 停止。

為了演示整體邏輯,下面的例子展示了一個(gè)僅僅輸出值的 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 

如果你看了上面的代碼邏輯,就會(huì)發(fā)現(xiàn)很簡(jiǎn)單,創(chuàng)建了有 5 個(gè) worker 的工作池并且 job 隊(duì)列的大小是 20。

接著,模擬 job 創(chuàng)建和處理過(guò)程:一旦 job 被創(chuàng)建就會(huì) push 到任務(wù)隊(duì)列里,等待著的 worker 便會(huì)從隊(duì)列里取出 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

 

責(zé)任編輯:武曉燕 來(lái)源: Golang來(lái)啦
相關(guān)推薦

2021-07-26 10:14:38

Go語(yǔ)言工具

2024-08-21 08:21:45

CNN算法神經(jīng)網(wǎng)絡(luò)

2024-08-02 10:28:13

算法NLP模型

2024-07-19 08:21:24

2024-06-03 08:09:39

2024-12-19 00:16:43

2024-06-06 09:44:33

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深度學(xué)習(xí)

2024-12-04 10:33:17

2024-11-11 00:00:02

卷積神經(jīng)網(wǎng)絡(luò)算法

2011-07-22 16:29:53

IOS Demo CD

2021-03-09 17:09:42

拷貝算法對(duì)象

2023-03-26 22:02:53

APMPR監(jiān)控

2024-06-21 08:15:25

2024-06-19 09:47:21

2021-10-04 09:29:41

對(duì)象池線程池

2020-04-10 10:15:29

算法開(kāi)源Github
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

在线观看日韩| 视频免费观看| 国产精品视频一区二区三区| 精品免费在线观看| 国内精品视频一区二区三区| 精品久久不卡| 中文日韩电影网站| 国产黄色在线网站| 图片区小说区国产精品视频| 波多野结衣家庭教师视频| 国产视频欧美| 亚洲xxx自由成熟| 欧美巨大xxxx| 最近的2019中文字幕免费一页 | 成人免费视频视频在线观看免费| 91一区二区三区| 美日韩黄色大片| 尤物yw午夜国产精品视频| 韩国av网站在线| 疯狂做受xxxx欧美肥白少妇| 九七伦理97伦理手机| 成人激情文学综合网| 久久免费视频2| 日韩福利视频网| 欧美三级华人主播| 亚洲精品女人| 精品网站在线看| 狠狠爱成人网| 国产乱人伦精品一区二区| 亚洲成av人片乱码色午夜| 国产不卡视频在线| 亚洲第一福利专区| 青青精品视频播放| 丝袜av一区| 日韩av片电影专区| 国产欧美久久一区二区三区| 国产精品ⅴa在线观看h| 欧美日韩一二三四| 国产精品久久久一区| 青青草国产成人a∨下载安卓| 国产成人涩涩涩视频在线观看| 噜噜噜天天躁狠狠躁夜夜精品 | 最新亚洲精品| 欧美一级高清免费播放| 另类图片第一页| 国产a级全部精品| 国产一区二区区别| 91亚洲人电影| 亚洲先锋影音| av777777| 久久麻豆精品| 在线日韩欧美视频| 国产美女在线播放| 青草av.久久免费一区| 欧美亚洲一区二区三区四区| 国产资源在线视频| 国产精品视频在线播放| 成人在线一区| 国产福利久久精品| 亚洲欧美日韩国产| 五月天色婷婷综合| 成人久久久精品乱码一区二区三区| 男人日女人视频网站| 亚洲国产成人私人影院tom| 日本免费视频www| 欧美影院一区二区| 国产精品一区hongkong| 日韩中文字幕网站| 国产影视一区| 久久国产精品99久久久久久丝袜| 精品在线一区二区三区| 最近免费中文字幕中文高清百度| 亚洲精品亚洲人成人网| 暖暖视频在线免费观看| 日韩欧美综合一区| 四虎影视精品永久在线观看| 日本韩国欧美精品大片卡二| 亚洲高清免费| 人人妻人人添人人爽欧美一区| 亚洲国产日韩综合久久精品| 日韩av激情| 欧美专区日韩视频| 99在线精品视频在线观看| 日韩视频在线视频| 亚洲h动漫在线| 日韩高清中文字幕一区二区| 国产成人鲁鲁免费视频a| 日韩影院精彩在线| 亚洲综合欧美激情| 欧美一级久久久久久久大片| 成人知道污网站| 日产中文字幕在线精品一区| 亚洲国产激情av| 2024最新电影免费在线观看| 91豆花精品一区| 麻豆国产一区二区| 最新中文字幕在线视频| 亚洲午夜久久久久久久| 久久福利综合| 国产九九九九九| 欧美少妇一区二区| 精品视频自拍| 国产女人18毛片| 欧美视频一区二区三区…| 日韩三级成人| 奇米视频888战线精品播放| 日韩毛片精品高清免费| 亚洲精华液一区二区三区| 91精品视频免费| 国产欧美日韩精品一区| 天堂电影一区| 国产精品亚洲不卡a| 亚洲男人的天堂在线aⅴ视频| 美女av在线免费看| 99视频日韩| 亚洲久本草在线中文字幕| 欧美电影在线观看网站| 欧洲精品国产| 一本到一区二区三区| 久久悠悠精品综合网| 免费的一级黄色片| 欧美一卡2卡3卡4卡| 国产精品不卡| av免费播放| 久久99热精品| 高潮精品一区videoshd| 成人影院在线观看| 91网免费观看| 洋洋成人永久网站入口| 成人在线tv视频| 日韩av中文字幕第一页| 亚洲第一区中文字幕| 亚洲美女视频在线免费观看 | 亚洲综合无码一区二区| 激情中国色综合| 正在播放久久| 日韩一级完整毛片| 国内一区二区三区| 中文字幕一区免费| 国产精品免费久久久久影院 | 日韩免费av一区二区三区| 精品国产1区2区| 国产成人1区| 国产1区2区3区| 日韩av免费在线观看| 国产精品伦一区| 国产精品自在| 国产视频1区2区3区| 欧美大片免费观看| 久久久久久久电影| 视频一区日韩精品| 亚洲福利精品视频| 欧美激情xxxx性bbbb| 久久综合色鬼综合色| 欧美视频二区欧美影视| 日韩中文字幕免费在线| 欧美极品少妇全裸体| 中文字幕乱码一区二区免费| 亚洲a级精品| 亚洲裸体视频| 狠狠干一区二区| 日韩美女视频在线| 免费成人美女在线观看| 电影在线观看一区| 丁香婷婷综合激情| 欧美精品一区三区| 国产精品毛片无遮挡高清| 免费成人av| 九九在线视频| 欧美主播一区二区三区美女 久久精品人 | 成人综合av| 69久久夜色精品国产69| 亚洲免费毛片网站| 天天色天天射综合网| 免费网站免费进入在线| 最新av在线免费观看| 久久精品国产一区二区三区| 中文字幕精品一区二区三区精品 | 任你弄精品视频免费观看| 免费成人黄色网址| 国产精品久久国产精品99gif| 五月激情综合网| 亚洲激情专区| 婷婷综合六月| 国产911网站| 精品视频免费观看| 中文字幕精品一区二区精品| 国产精品久久久久毛片软件| 亚洲精品网址| f2c人成在线观看免费视频| 久久国产精品视频在线观看| 啪一啪鲁一鲁2019在线视频| 狠狠操狠狠色综合网| 久久se精品一区精品二区| 亚洲精品视频一二三区| 精品推荐蜜桃传媒| 黄色一级视频片| 成人久久一区二区| 亚洲人成电影网站色…| 亚洲韩国精品一区|