golang實(shí)現(xiàn)并發(fā)數(shù)控制的方法
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ā)處理非常簡(jiǎn)單,只需要在調(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ù)控制的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 使用google-perftools優(yōu)化nginx在高并發(fā)時(shí)的性能的教程(完整版)
- Golang極簡(jiǎn)入門教程(三):并發(fā)支持
- Go語言并發(fā)技術(shù)詳解
- Go語言并發(fā)模型的2種編程方案
- GO語言并發(fā)編程之互斥鎖、讀寫鎖詳解
- Go語言如何并發(fā)超時(shí)處理詳解
- 如何利用Golang寫出高并發(fā)代碼詳解
- 詳解Golang 中的并發(fā)限制與超時(shí)控制
- golang中sync.Map并發(fā)創(chuàng)建、讀取問題實(shí)戰(zhàn)記錄
- Go 并發(fā)實(shí)現(xiàn)協(xié)程同步的多種解決方法
- 在Go中構(gòu)建并發(fā)TCP服務(wù)器
- Go 并發(fā)控制context實(shí)現(xiàn)原理剖析(小結(jié))
- Go并發(fā)調(diào)用的超時(shí)處理的方法
- golang 并發(fā)安全Map以及分段鎖的實(shí)現(xiàn)方法
- golang并發(fā)下載多個(gè)文件的方法
- Golang 實(shí)現(xiàn)分片讀取http超大文件流和并發(fā)控制
- golang gin 框架 異步同步 goroutine 并發(fā)操作
- Go并發(fā)4種方法簡(jiǎn)明講解
相關(guān)文章
golang?四則運(yùn)算計(jì)算器yacc歸約手寫實(shí)現(xiàn)
這篇文章主要為大家介紹了golang?四則運(yùn)算?計(jì)算器?yacc?歸約的手寫實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07golang常用庫之gorilla/mux-http路由庫使用詳解
這篇文章主要介紹了golang常用庫之gorilla/mux-http路由庫使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法
在 Golang 中,結(jié)構(gòu)體和方法是實(shí)現(xiàn)面向?qū)ο缶幊痰闹匾M成部分,也是 Golang 的核心概念之一。在本篇文章中,我們將深入介紹 Golang 結(jié)構(gòu)體與方法的概念、使用方法以及相關(guān)的編程技巧和最佳實(shí)踐2023-04-04一文帶你深入了解Golang中的參數(shù)傳遞機(jī)制
值傳遞和引用傳遞是編程語言中兩種主要的參數(shù)傳遞方式,決定了函數(shù)調(diào)用過程中實(shí)參如何影響形參以及函數(shù)內(nèi)部對(duì)形參的修改是否會(huì)影響到原始實(shí)參,下面就跟隨小編一起深入了解下golang中參數(shù)傳遞機(jī)制吧2024-01-01Golang中interface{}轉(zhuǎn)為數(shù)組的操作
這篇文章主要介紹了Golang中interface{}轉(zhuǎn)為數(shù)組的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04