欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2017年12月15日 10:24:46   作者:hzwy23  
下面小編就為大家分享一篇golang實現(xiàn)并發(fā)數(shù)控制的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

golang并發(fā)

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

開啟golang并發(fā)

golang開啟并發(fā)處理非常簡單,只需要在調(diào)用函數(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方法時,在前邊加上了go關(guān)鍵字,則函數(shù)Goroutine并發(fā)執(zhí)行開啟成功。

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

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

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

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

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

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

相關(guān)文章

  • golang?四則運算計算器yacc歸約手寫實現(xiàn)

    golang?四則運算計算器yacc歸約手寫實現(xiàn)

    這篇文章主要為大家介紹了golang?四則運算?計算器?yacc?歸約的手寫實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • go語言里包的用法實例

    go語言里包的用法實例

    這篇文章主要介紹了go語言里包的用法,實例分析了Go語言里包的原理與使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • 用go gin server來做文件上傳服務(wù)

    用go gin server來做文件上傳服務(wù)

    今天小編就為大家分享一篇關(guān)于用go gin server來做文件上傳服務(wù),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • golang常用庫之gorilla/mux-http路由庫使用詳解

    golang常用庫之gorilla/mux-http路由庫使用詳解

    這篇文章主要介紹了golang常用庫之gorilla/mux-http路由庫使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • go語言中http超時引發(fā)的事故解決

    go語言中http超時引發(fā)的事故解決

    我們使用的是golang標準庫的http client,對于一些http請求,我們在處理的時候,會考慮加上超時時間,如果超時可能會引起報錯,本文就記一次超時引發(fā)的事故
    2021-06-06
  • 一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法

    一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法

    在 Golang 中,結(jié)構(gòu)體和方法是實現(xiàn)面向?qū)ο缶幊痰闹匾M成部分,也是 Golang 的核心概念之一。在本篇文章中,我們將深入介紹 Golang 結(jié)構(gòu)體與方法的概念、使用方法以及相關(guān)的編程技巧和最佳實踐
    2023-04-04
  • 一文帶你深入了解Golang中的參數(shù)傳遞機制

    一文帶你深入了解Golang中的參數(shù)傳遞機制

    值傳遞和引用傳遞是編程語言中兩種主要的參數(shù)傳遞方式,決定了函數(shù)調(diào)用過程中實參如何影響形參以及函數(shù)內(nèi)部對形參的修改是否會影響到原始實參,下面就跟隨小編一起深入了解下golang中參數(shù)傳遞機制吧
    2024-01-01
  • Golang中interface{}轉(zhuǎn)為數(shù)組的操作

    Golang中interface{}轉(zhuǎn)為數(shù)組的操作

    這篇文章主要介紹了Golang中interface{}轉(zhuǎn)為數(shù)組的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 一文完全掌握 Go math/rand(源碼解析)

    一文完全掌握 Go math/rand(源碼解析)

    這篇文章主要介紹了一文完全掌握 Go math/rand(源碼解析),本文可以幫助大家快速使用Go Rand.,感興趣的朋友跟隨小編一起看看吧
    2021-04-04
  • 使用Go語言進行條件編譯的示例代碼

    使用Go語言進行條件編譯的示例代碼

    Go的條件編譯主要通過構(gòu)建標簽(build?tags)和構(gòu)建約束(build?constraints)來實現(xiàn),這些標簽和約束可以讓我們針對不同的操作系統(tǒng)、架構(gòu)或特定條件編寫特定代碼,本文給大家介紹了如何使用Go語言進行條件編譯,需要的朋友可以參考下
    2024-06-06

最新評論