channel一個(gè)類(lèi)型管道,通過(guò)它可以在goroutine之間發(fā)送和接收消息。它是Golang在語(yǔ)言層面提供的goroutine間的通信方式。
Channel是Go中的一個(gè)核心類(lèi)型,你可以把它看成一個(gè)管道,通過(guò)它并發(fā)核心單元就可以發(fā)送或者接收數(shù)據(jù)進(jìn)行通訊(communication)。
它的操作符是箭頭<-。
有這么一種場(chǎng)景,協(xié)程A執(zhí)行過(guò)程中需要?jiǎng)?chuàng)建子協(xié)程A1、A2、A3…An,協(xié)程A創(chuàng)建完子協(xié)程后就等待子協(xié)程退出。
針對(duì)這種場(chǎng)景,GO提供了三種解決方案:
三種方案各有優(yōu)劣,比如Channel優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,清晰易懂,WaitGroup優(yōu)點(diǎn)是子協(xié)程個(gè)數(shù)動(dòng)態(tài)可調(diào)整,Context優(yōu)點(diǎn)是對(duì)子協(xié)程派生出來(lái)的孫子協(xié)程的控制。缺點(diǎn)是相對(duì)而言的,要結(jié)合實(shí)例應(yīng)用場(chǎng)景進(jìn)行選擇。
channel一般用于協(xié)程之間的通信,channel也可以用于并發(fā)控制。比如主協(xié)程啟動(dòng)N個(gè)子協(xié)程,主協(xié)程等待所有子協(xié)程退出后再繼續(xù)后續(xù)流程,這種場(chǎng)景下channel也可輕易實(shí)現(xiàn)。
package mainimport ( "time" "fmt")func Process(ch chan int) { //Do some work... time.Sleep(time.Second) ch <- 1 //管道中寫(xiě)入一個(gè)元素表示當(dāng)前協(xié)程已結(jié)束}func main() { channels := make([]chan int, 10) //創(chuàng)建一個(gè)10個(gè)元素的切片,元素類(lèi)型為channel for i:= 0; i < 10; i++ { channels[i] = make(chan int) //切片中放入一個(gè)channel go Process(channels[i]) //啟動(dòng)協(xié)程,傳一個(gè)管道用于通信 } for i, ch := range channels { //遍歷切片,等待子協(xié)程結(jié)束 <-ch fmt.Println("Routine ", i, " quit!") }}上面程序通過(guò)創(chuàng)建N個(gè)channel來(lái)管理N個(gè)協(xié)程,每個(gè)協(xié)程都有一個(gè)channel用于跟父協(xié)程通信,父協(xié)程創(chuàng)建完所有協(xié)程后等待所有協(xié)程結(jié)束。
這個(gè)例子中,父協(xié)程僅僅是等待子協(xié)程結(jié)束,其實(shí)父協(xié)程也可以向管道中寫(xiě)入數(shù)據(jù)通知子協(xié)程結(jié)束,這時(shí)子協(xié)程需要定期地探測(cè)管道中是否有消息出現(xiàn)。
使用channel來(lái)控制子協(xié)程的優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,缺點(diǎn)是當(dāng)需要大量創(chuàng)建協(xié)程時(shí)就需要有相同數(shù)量的channel,而且對(duì)于子協(xié)程繼續(xù)派生出來(lái)的協(xié)程不方便控制。
本文鏈接:http://m.www897cc.com/showinfo-26-97904-0.htmlGo語(yǔ)言并發(fā)控制Channel使用場(chǎng)景分析與解決方案
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com