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

GoLang channel使用介紹

 更新時(shí)間:2022年10月11日 10:29:36   作者:~龐貝  
Channel 和 goroutine 的結(jié)合是 Go 并發(fā)編程的大殺器。而 Channel 的實(shí)際應(yīng)用也經(jīng)常讓人眼前一亮,通過(guò)與 select,cancel,timer 等結(jié)合,它能實(shí)現(xiàn)各種各樣的功能。接下來(lái),我們就要梳理一下 channel 的應(yīng)用

停止信號(hào)

channel 用于停止信號(hào)的場(chǎng)景還是挺多的,經(jīng)常是關(guān)閉某個(gè) channel 或者向 channel 發(fā)送一個(gè)元素,使得接收 channel 的那一方獲知道此信息,進(jìn)而做一些其他的操作。

任務(wù)定時(shí)

與 timer 結(jié)合,一般有兩種玩法:實(shí)現(xiàn)超時(shí)控制,實(shí)現(xiàn)定期執(zhí)行某個(gè)任務(wù)。

有時(shí)候,需要執(zhí)行某項(xiàng)操作,但又不想它耗費(fèi)太長(zhǎng)時(shí)間,上一個(gè)定時(shí)器就可以搞定:

select {
	case <-time.After(100 * time.Millisecond):
	case <-s.stopc:
		return false
}

等待 100 ms 后,如果 s.stopc 還沒(méi)有讀出數(shù)據(jù)或者被關(guān)閉,就直接結(jié)束。這是來(lái)自 etcd 源碼里的一個(gè)例子,這樣的寫(xiě)法隨處可見(jiàn)。

定時(shí)執(zhí)行某個(gè)任務(wù),也比較簡(jiǎn)單:

func worker() {
	ticker := time.Tick(1 * time.Second)
	for {
		select {
		case <- ticker:
			// 執(zhí)行定時(shí)任務(wù)
			fmt.Println("執(zhí)行 1s 定時(shí)任務(wù)")
		}
	}
}

每隔 1 秒種,執(zhí)行一次定時(shí)任務(wù)。

解耦生產(chǎn)方和消費(fèi)方

服務(wù)啟動(dòng)時(shí),啟動(dòng) n 個(gè) worker,作為工作協(xié)程池,這些協(xié)程工作在一個(gè) for {} 無(wú)限循環(huán)里,從某個(gè) channel 消費(fèi)工作任務(wù)并執(zhí)行:

func main() {
	taskCh := make(chan int, 100)
	go worker(taskCh)
    // 塞任務(wù)
	for i := 0; i < 10; i++ {
		taskCh <- i
	}
    // 等待 1 小時(shí) 
	select {
	case <-time.After(time.Hour):
	}
}
func worker(taskCh <-chan int) {
	const N = 5
	// 啟動(dòng) 5 個(gè)工作協(xié)程
	for i := 0; i < N; i++ {
		go func(id int) {
			for {
				task := <- taskCh
				fmt.Printf("finish task: %d by worker %d\n", task, id)
				time.Sleep(time.Second)
			}
		}(i)
	}
}

5 個(gè)工作協(xié)程在不斷地從工作隊(duì)列里取任務(wù),生產(chǎn)方只管往 channel 發(fā)送任務(wù)即可,解耦生產(chǎn)方和消費(fèi)方。

finish task: 1 by worker 4
finish task: 2 by worker 2
finish task: 4 by worker 3
finish task: 3 by worker 1
finish task: 0 by worker 0
finish task: 6 by worker 0
finish task: 8 by worker 3
finish task: 9 by worker 1
finish task: 7 by worker 4
finish task: 5 by worker 2

控制并發(fā)數(shù)

有時(shí)需要定時(shí)執(zhí)行幾百個(gè)任務(wù),例如每天定時(shí)按城市來(lái)執(zhí)行一些離線計(jì)算的任務(wù)。但是并發(fā)數(shù)又不能太高,因?yàn)槿蝿?wù)執(zhí)行過(guò)程依賴第三方的一些資源,對(duì)請(qǐng)求的速率有限制。這時(shí)就可以通過(guò) channel 來(lái)控制并發(fā)數(shù)。

下面的例子來(lái)自《Go 語(yǔ)言高級(jí)編程》:

var limit = make(chan int, 3)
func main() {
    // …………
    for _, w := range work {
        go func() {
            limit <- 1
            w()
            <-limit
        }()
    }
    // …………
}

構(gòu)建一個(gè)緩沖型的 channel,容量為 3。接著遍歷任務(wù)列表,每個(gè)任務(wù)啟動(dòng)一個(gè) goroutine 去完成。真正執(zhí)行任務(wù),訪問(wèn)第三方的動(dòng)作在 w() 中完成,在執(zhí)行 w() 之前,先要從 limit 中拿“許可證”,拿到許可證之后,才能執(zhí)行 w(),并且在執(zhí)行完任務(wù),要將“許可證”歸還。這樣就可以控制同時(shí)運(yùn)行的 goroutine 數(shù)。

這里,limit <- 1 放在 func 內(nèi)部而不是外部,原因是:

如果在外層,就是控制系統(tǒng) goroutine 的數(shù)量,可能會(huì)阻塞 for 循環(huán),影響業(yè)務(wù)邏輯。

limit 其實(shí)和邏輯無(wú)關(guān),只是性能調(diào)優(yōu),放在內(nèi)層和外層的語(yǔ)義不太一樣。

還有一點(diǎn)要注意的是,如果 w() 發(fā)生 panic,那“許可證”可能就還不回去了,因此需要使用 defer 來(lái)保證。

到此這篇關(guān)于GoLang channel使用介紹的文章就介紹到這了,更多相關(guān)Go channel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言中interface語(yǔ)法與使用詳解

    Go語(yǔ)言中interface語(yǔ)法與使用詳解

    Go語(yǔ)言里面設(shè)計(jì)最精妙的應(yīng)該算interface,它讓面向?qū)ο?內(nèi)容組織實(shí)現(xiàn)非常的方便,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中interface語(yǔ)法與使用的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • go使用net/url包來(lái)解析URL提取主機(jī)部分

    go使用net/url包來(lái)解析URL提取主機(jī)部分

    這篇文章主要為大家介紹了go使用net/url包來(lái)解析URL提取主機(jī)部分實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go語(yǔ)言操作etcd的示例詳解

    Go語(yǔ)言操作etcd的示例詳解

    etcd是使用Go語(yǔ)言開(kāi)發(fā)的一個(gè)開(kāi)源的、高可用的分布式key—value存儲(chǔ)系統(tǒng),可以用于配置共享和服務(wù)的注冊(cè)和發(fā)現(xiàn),下面我們就來(lái)看看Go語(yǔ)言是如何操作etcd的吧
    2024-03-03
  • Golang中匿名組合實(shí)現(xiàn)偽繼承的方法

    Golang中匿名組合實(shí)現(xiàn)偽繼承的方法

    這篇文章主要介紹了Golang中匿名組合實(shí)現(xiàn)偽繼承的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 總結(jié)Golang四種不同的參數(shù)配置方式

    總結(jié)Golang四種不同的參數(shù)配置方式

    這篇文章主要介紹了總結(jié)Golang四種不同的參數(shù)配置方式,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 解決golang編譯提示dial tcp 172.217.160.113:443: connectex: A connection attempt failed(推薦)

    解決golang編譯提示dial tcp 172.217.160.113:443: con

    這篇文章主要介紹了解決golang編譯提示dial tcp 172.217.160.113:443: connectex: A connection attempt failed,此問(wèn)題完美解決,需要的朋友可以參考下
    2023-02-02
  • golang設(shè)置http response響應(yīng)頭與填坑記錄

    golang設(shè)置http response響應(yīng)頭與填坑記錄

    這篇文章主要給大家介紹了關(guān)于golang設(shè)置http response響應(yīng)頭與填坑記錄的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • 一文深入探討Go語(yǔ)言中的if-else語(yǔ)句

    一文深入探討Go語(yǔ)言中的if-else語(yǔ)句

    在Go語(yǔ)言中,條件語(yǔ)句的使用方式相對(duì)簡(jiǎn)潔明了,所以本文將探討一下如何在Go程序中有效地進(jìn)行條件判斷和邏輯控制,感興趣的小伙伴可以了解下
    2023-08-08
  • 詳解MongoDB?Go?Driver如何記錄日志

    詳解MongoDB?Go?Driver如何記錄日志

    這篇文章主要為大家介紹了MongoDB?Go?Driver如何記錄日志詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • golang-gin-mgo高并發(fā)服務(wù)器搭建教程

    golang-gin-mgo高并發(fā)服務(wù)器搭建教程

    這篇文章主要介紹了golang-gin-mgo高并發(fā)服務(wù)器搭建教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12

最新評(píng)論