国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

golang實現并發數控制的方法

2020-04-01 19:00:21
字體:
來源:轉載
供稿:網友

golang并發

談到golang這門語言,很自然的想起了他的的并發goroutine。這也是這門語言引以為豪的功能點。并發處理,在某種程度上,可以提高我們對機器的使用率,提升系統業務處理能力。但是并不是并發量越大越好,太大了,硬件環境就會吃不消,反而會影響到系統整體性能,甚至奔潰。所以,在使用golang提供便捷的goroutine時,既要能夠實現開啟并發,也要學會如果控制并發量。

開啟golang并發

golang開啟并發處理非常簡單,只需要在調用函數時,在函數前邊添加上go關鍵字即可。如下邊例子所示:

package mainimport (  "fmt"  "time")type Demo struct {  input     chan string  output    chan string  max_goroutine chan int}func NewDemo() *Demo {  d := new(Demo)  d.input = make(chan string, 24)  d.output = make(chan string, 24)  d.max_goroutine = make(chan int, 20)  return d}func (this *Demo) Goroutine() {  var i = 1000  for {    this.input <- time.Now().Format("2006-01-02 15:04:05")    time.Sleep(time.Second * 1)    if i < 0 {      break    }    i--  }  close(this.input)}func (this *Demo) Handle() {  for t := range this.input {    fmt.Println("datatime is :", t)    this.output <- t  }}func main() {  demo := NewDemo()  go demo.Goroutine()  demo.Handle()}

上邊代碼,在調用Demo的Goroutine方法時,在前邊加上了go關鍵字,則函數Goroutine并發執行開啟成功。

可見,在golang中開啟并發非常的方便。

下邊再來看看,在golang中,怎么實現并發量的控制。

當goroutine并發執行的任務達到一定值時,主程序等待goroutine執行完成退出,一旦發現并發數量低于某一個設定的值,就從新開始執行主程序邏輯。

實現代碼如下:

package mainimport (  "fmt"  "time")type Demo struct {  input     chan string  output    chan string  goroutine_cnt chan int}func NewDemo() *Demo {  d := new(Demo)  d.input = make(chan string, 8192)  d.output = make(chan string, 8192)  d.goroutine_cnt = make(chan int, 10)  return d}func (this *Demo) Goroutine() {  this.input <- time.Now().Format("2006-01-02 15:04:05")  time.Sleep(time.Millisecond * 500)  <-this.goroutine_cnt}func (this *Demo) Handle() {  for t := range this.input {    fmt.Println("datatime is :", t, "goroutine count is :", len(this.goroutine_cnt))    this.output <- t + "handle"  }}func main() {  demo := NewDemo()  go demo.Handle()  for i := 0; i < 10000; i++ {    demo.goroutine_cnt <- 1    go demo.Goroutine()  }  close(demo.input)}

如上邊示例,Goroutine()函數,每隔500毫秒寫入一個時間戳到管道中,不考慮管道的讀取時間,也就是說,每個Goroutine會存在大概500毫秒時間,如果不做控制的話,一瞬間可以開啟上萬個甚至更多的goroutine出來,這樣系統就會奔潰。

在上述代碼中,我們引入了帶10個buffer的chan int字段,每創建一個goroutine時,就會向這個chan中寫入一個1,每完成一個goroutine時,就會從chan中彈出一個1。當chan中裝滿10個1時,就會自動阻塞,等待goroutine執行完,彈出chan中的值時,才能繼續開啟goroutine。通過chan阻塞特點,實現了goroutine的最大并發量控制。

以上這篇golang實現并發數控制的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 诏安县| 翼城县| 密山市| 永康市| 清苑县| 昌图县| 科技| 赣州市| 海门市| 都兰县| 南昌县| 龙陵县| 西和县| 新丰县| 靖边县| 固镇县| 依安县| 垦利县| 西平县| 淅川县| 靖州| 禄劝| 内丘县| 芦溪县| 临猗县| 西乌珠穆沁旗| 上饶市| 玉树县| 东莞市| 石家庄市| 阜平县| 纳雍县| 连南| 湖南省| 无为县| 张家港市| 临桂县| 石林| 澄城县| 澳门| 渭南市|