主頁 > 知識庫 > golang開發(fā)中channel使用

golang開發(fā)中channel使用

熱門標簽:福州鐵通自動外呼系統(tǒng) 澳門防封電銷卡 長沙ai機器人電銷 廣東語音外呼系統(tǒng)供應商 賺地圖標注的錢犯法嗎 地圖標注測試 濮陽自動外呼系統(tǒng)代理 烏魯木齊人工電銷機器人系統(tǒng) 智能電銷機器人營銷

channel[通道]是golang的一種重要特性,正是因為channel的存在才使得golang不同于其它語言。channel使得并發(fā)編程變得簡單容易有趣。

channel的概念和語法

一個channel可以理解為一個先進先出的消息隊列。channel用來在協(xié)程[goroutine]之前傳遞數(shù)據(jù),準確的說,是用來傳遞數(shù)據(jù)的所有權。一個設計良好的程序應該確保同一時刻channel里面的數(shù)據(jù)只會被同一個協(xié)程擁有,這樣就可以避免并發(fā)帶來的數(shù)據(jù)不安全問題[data races]。

正文

channel主要是用于多個goroutine之間通信

channel語法

channel是引用類型,需要實用make來創(chuàng)建channel,如下
make(chan Type, [buffer])
chan Type 通道的類型
buffer 是可選參數(shù),代表通道緩沖區(qū)的大小(省略則代表無緩沖)
向channel里面寫入數(shù)據(jù)使用 - 符號

q := make(chan bool)
q-true

從channel里面讀取數(shù)據(jù)也是使用 - 符號,只不過寫入的channel在右邊,讀取的時候channel在左邊。意思跟方向是一致的,一個是數(shù)據(jù)進入channel,一個是數(shù)據(jù)從channel出去

q := make(chan bool)
-q

有緩沖channel的使用

我們一直使用的無緩沖的channel,今天主要學習下有緩存的channel。
無緩沖的channel,寫入數(shù)據(jù)后一定要有goroutine 從channel讀取數(shù)據(jù)后再寫入,否則程序會panic。

func main() {
	ch := make(chan int)
	ch-1
}

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:

有緩沖的channel,可以寫入緩沖大小個數(shù)據(jù),可以沒有goroutine從channel讀取。

func main() {
	ch := make(chan int,2)
	ch-1
	ch-2
}


Process finished with exit code 0

執(zhí)行結果跟預期是一致的。

有緩沖大小的channel使用場景

假如我們有一個任務需要10個goroutine去調(diào)度執(zhí)行,只要有一個goroutine執(zhí)行完畢,調(diào)度就應該結束。我們看下偽代碼

func test(wg *sync.WaitGroup,ch chan int,i int) {
	fmt.Println("test code")
	ch-i
}

func main() {
	fmt.Println("start",runtime.NumGoroutine())
	ch := make(chan int)
	wg := new(sync.WaitGroup)
	for i:=0;i10;i++ {
		wg.Add(1)
		go test(wg,ch,i)
	}
	fmt.Println(-ch)
	fmt.Println("end",runtime.NumGoroutine())
	wg.Done()
}

start 1
test code
9
end 10

從執(zhí)行結果上看,是第9個goroutine首先執(zhí)行完畢了。程序也正常退出了。但是我們看到,加上主goroutine,內(nèi)存中一共有11個goroutine,程序退出的時候還有10個goroutine,減去一個主goroutine,還有9個goroutine沒有退出,這個對程序來說是不允許,可能會泄漏或者長期占用資源不釋放。

但是我們?nèi)绻褂昧擞芯彌_的channel,就可以利用channel的緩沖機制正常退出全部的goroutine了。
看下代碼

func test(wg *sync.WaitGroup,ch chan int,i int) {
	ch-i
}

func main() {
	fmt.Println("start",runtime.NumGoroutine())
	ch := make(chan int, 10)
	wg := new(sync.WaitGroup)
	for i:=0;i10;i++ {
		wg.Add(1)
		go test(wg,ch,i)
	}
	fmt.Println(-ch,"success")
	for i:= 0;i9;i++ {
	 fmt.Println(-ch)
	}
	fmt.Println("end",runtime.NumGoroutine())
	wg.Done()
}

start 1
0 success
1
2
4
3
5
6
7
8
9
end 1

Process finished with exit code 0

打印success的時候,第一個goroutine已經(jīng)將任務完成,循環(huán)9次將channel里面的數(shù)據(jù)讀取出來,保證創(chuàng)建的goroutine都不會阻塞能夠正常退出來。

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

您可能感興趣的文章:
  • Golang實現(xiàn)Directional Channel(定向通道)
  • Golang的select多路復用及channel使用操作
  • 詳解Golang中Channel的用法
  • 基于golang channel實現(xiàn)的輕量級異步任務分發(fā)器示例代碼
  • golang中for循環(huán)遍歷channel時需要注意的問題詳解
  • golang 函數(shù)返回chan類型的操作

標簽:廣西 太原 貴陽 調(diào)研邀請 慶陽 阿克蘇 西雙版納 德州

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