新聞中心
前面的例子創(chuàng)建的都是無緩沖通道。使用無緩沖通道往里面裝入數(shù)據(jù)時(shí),裝入方將被阻塞,直到另外通道在另外一個(gè) goroutine 中被取出。同樣,如果通道中沒有放入任何數(shù)據(jù),接收方試圖從通道中獲取數(shù)據(jù)時(shí),同樣也是阻塞。發(fā)送和接收的操作是同步完成的。

龍泉網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),龍泉網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為龍泉千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個(gè)售后服務(wù)好的龍泉做網(wǎng)站的公司定做!
下面通過一個(gè)并發(fā)打印的例子,將 goroutine 和 channel 放在一起展示它們的用法。
package main
import (
"fmt"
)
func printer(c chan int) {
// 開始無限循環(huán)等待數(shù)據(jù)
for {
// 從channel中獲取一個(gè)數(shù)據(jù)
data := <-c
// 將0視為數(shù)據(jù)結(jié)束
if data == 0 {
break
}
// 打印數(shù)據(jù)
fmt.Println(data)
}
// 通知main已經(jīng)結(jié)束循環(huán)(我搞定了!)
c <- 0
}
func main() {
// 創(chuàng)建一個(gè)channel
c := make(chan int)
// 并發(fā)執(zhí)行printer, 傳入channel
go printer(c)
for i := 1; i <= 10; i++ {
// 將數(shù)據(jù)通過channel投送給printer
c <- i
}
// 通知并發(fā)的printer結(jié)束循環(huán)(沒數(shù)據(jù)啦!)
c <- 0
// 等待printer結(jié)束(搞定喊我!)
<-c
}運(yùn)行代碼,輸出如下:
1
2
3
4
5
6
7
8
9
10
代碼說明如下:
- 第 10 行,創(chuàng)建一個(gè)無限循環(huán),只有當(dāng)?shù)?16 行獲取到的數(shù)據(jù)為 0 時(shí)才會(huì)退出循環(huán)。
- 第 13 行,從函數(shù)參數(shù)傳入的通道中獲取一個(gè)整型數(shù)值。
- 第 21 行,打印整型數(shù)值。
- 第 25 行,在退出循環(huán)時(shí),通過通道通知 main() 函數(shù)已經(jīng)完成工作。
- 第 32 行,創(chuàng)建一個(gè)整型通道進(jìn)行跨 goroutine 的通信。
- 第 35 行,創(chuàng)建一個(gè) goroutine,并發(fā)執(zhí)行 printer() 函數(shù)。
- 第 37 行,構(gòu)建一個(gè)數(shù)值循環(huán),將 1~10 的數(shù)通過通道傳送給 printer 構(gòu)造出的 goroutine。
- 第 44 行,給通道傳入一個(gè) 0,表示將前面的數(shù)據(jù)處理完成后,退出循環(huán)。
- 第 47 行,在數(shù)據(jù)發(fā)送過去后,因?yàn)椴l(fā)和調(diào)度的原因,任務(wù)會(huì)并發(fā)執(zhí)行。這里需要等待 printer 的第 25 行返回?cái)?shù)據(jù)后,才可以退出 main()。
本例的 設(shè)計(jì)模式就是典型的生產(chǎn)者和消費(fèi)者。生產(chǎn)者是第 37 行的循環(huán),而消費(fèi)者是 printer() 函數(shù)。整個(gè)例子使用了兩個(gè) goroutine,一個(gè)是 main(),一個(gè)是通過第 35 行 printer() 函數(shù)創(chuàng)建的 goroutine。兩個(gè) goroutine 通過第 32 行創(chuàng)建的通道進(jìn)行通信。這個(gè)通道有下面兩重功能。
- 數(shù)據(jù)傳送:第 40 行中發(fā)送數(shù)據(jù)和第 13 行接收數(shù)據(jù)。
- 控制指令:類似于信號(hào)量的功能。同步 goroutine 的操作。功能簡單描述為:
- 第 44 行:“沒數(shù)據(jù)啦!”
- 第 25 行:“我搞定了!”
- 第 47 行:“搞定喊我!”
當(dāng)前名稱:創(chuàng)新互聯(lián)GO教程:Go語言并發(fā)打?。ń柚ǖ缹?shí)現(xiàn))
當(dāng)前網(wǎng)址:http://www.5511xx.com/article/cdpeiog.html


咨詢
建站咨詢
