主頁 > 知識(shí)庫 > golang實(shí)現(xiàn)并發(fā)數(shù)控制的方法

golang實(shí)現(xiàn)并發(fā)數(shù)控制的方法

熱門標(biāo)簽:釘釘有地圖標(biāo)注功能嗎 鄭州亮點(diǎn)科技用的什么外呼系統(tǒng) 建造者2地圖標(biāo)注 惠州電銷防封電話卡 濱州自動(dòng)電銷機(jī)器人排名 浙江高頻外呼系統(tǒng)多少錢一個(gè)月 汕頭小型外呼系統(tǒng) 黃岡人工智能電銷機(jī)器人哪個(gè)好 阿里云ai電話機(jī)器人

golang并發(fā)

談到golang這門語言,很自然的想起了他的的并發(fā)goroutine。這也是這門語言引以為豪的功能點(diǎn)。并發(fā)處理,在某種程度上,可以提高我們對(duì)機(jī)器的使用率,提升系統(tǒng)業(yè)務(wù)處理能力。但是并不是并發(fā)量越大越好,太大了,硬件環(huán)境就會(huì)吃不消,反而會(huì)影響到系統(tǒng)整體性能,甚至奔潰。所以,在使用golang提供便捷的goroutine時(shí),既要能夠?qū)崿F(xiàn)開啟并發(fā),也要學(xué)會(huì)如果控制并發(fā)量。

開啟golang并發(fā)

golang開啟并發(fā)處理非常簡單,只需要在調(diào)用函數(shù)時(shí),在函數(shù)前邊添加上go關(guān)鍵字即可。如下邊例子所示:

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()
}

上邊代碼,在調(diào)用Demo的Goroutine方法時(shí),在前邊加上了go關(guān)鍵字,則函數(shù)Goroutine并發(fā)執(zhí)行開啟成功。

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

下邊再來看看,在golang中,怎么實(shí)現(xiàn)并發(fā)量的控制。

當(dāng)goroutine并發(fā)執(zhí)行的任務(wù)達(dá)到一定值時(shí),主程序等待goroutine執(zhí)行完成退出,一旦發(fā)現(xiàn)并發(fā)數(shù)量低于某一個(gè)設(shè)定的值,就從新開始執(zhí)行主程序邏輯。

實(shí)現(xiàn)代碼如下:

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()函數(shù),每隔500毫秒寫入一個(gè)時(shí)間戳到管道中,不考慮管道的讀取時(shí)間,也就是說,每個(gè)Goroutine會(huì)存在大概500毫秒時(shí)間,如果不做控制的話,一瞬間可以開啟上萬個(gè)甚至更多的goroutine出來,這樣系統(tǒng)就會(huì)奔潰。

在上述代碼中,我們引入了帶10個(gè)buffer的chan int字段,每創(chuàng)建一個(gè)goroutine時(shí),就會(huì)向這個(gè)chan中寫入一個(gè)1,每完成一個(gè)goroutine時(shí),就會(huì)從chan中彈出一個(gè)1。當(dāng)chan中裝滿10個(gè)1時(shí),就會(huì)自動(dòng)阻塞,等待goroutine執(zhí)行完,彈出chan中的值時(shí),才能繼續(xù)開啟goroutine。通過chan阻塞特點(diǎn),實(shí)現(xiàn)了goroutine的最大并發(fā)量控制。

以上這篇golang實(shí)現(xiàn)并發(fā)數(shù)控制的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 如何利用Golang寫出高并發(fā)代碼詳解
  • golang高并發(fā)的深入理解
  • golang并發(fā)ping主機(jī)的方法

標(biāo)簽:東營 晉中 阿壩 瀘州 滄州 泰安 駐馬店 昭通

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang實(shí)現(xiàn)并發(fā)數(shù)控制的方法》,本文關(guān)鍵詞  golang,實(shí)現(xiàn),并發(fā),數(shù),控制,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang實(shí)現(xiàn)并發(fā)數(shù)控制的方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang實(shí)現(xiàn)并發(fā)數(shù)控制的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章