91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang中怎么實現并發數控制

發布時間:2021-07-06 15:37:18 來源:億速云 閱讀:175 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關golang中怎么實現并發數控制,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

golang并發

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

開啟golang并發

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

package main
import (
  "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 main
import (
  "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中怎么實現并發數控制了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

原阳县| 积石山| 惠东县| 会昌县| 普兰店市| 固镇县| 岢岚县| 榆社县| 长宁县| 扬州市| 洪雅县| 赞皇县| 简阳市| 茶陵县| 鄂温| 新巴尔虎右旗| 呼伦贝尔市| 庆云县| 霍山县| 常州市| 招远市| 泰和县| 如东县| 原平市| 中宁县| 潼关县| 鹤峰县| 芦溪县| 门头沟区| 视频| 丹棱县| 庆云县| 武川县| 博湖县| 洪江市| 噶尔县| 余江县| 原平市| 确山县| 靖远县| 丰顺县|