新聞中心
大家好,我是漁夫子。

成都創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司,專注成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷推廣,國(guó)際域名空間,網(wǎng)絡(luò)空間,網(wǎng)站托管維護(hù)有關(guān)企業(yè)網(wǎng)站制作方案、改版、費(fèi)用等問題,請(qǐng)聯(lián)系成都創(chuàng)新互聯(lián)。
今天給大家介紹的go channel的第二種應(yīng)用:協(xié)程間同步信息。
通過channel,能夠確保一個(gè)協(xié)程在另一個(gè)協(xié)程完成工作之后才能繼續(xù)。如果需要在兩個(gè)或多個(gè)協(xié)程之間共享數(shù)據(jù)的場(chǎng)景中,這種用法就特別有用,并且能夠確保數(shù)據(jù)不會(huì)同時(shí)被多個(gè)協(xié)程修改非常重要。
我們先看一個(gè)簡(jiǎn)單的示例:
package main
import (
"fmt"
"time"
)
func worker(done chan bool) {
fmt.Print("working...")
time.Sleep(time.Second)
fmt.Println("done")
done <- true
}
func main() {
done := make(chan bool, 1)
go worker(done)
<-done
}在這個(gè)示例中,我們創(chuàng)建了一個(gè)worker協(xié)程,同時(shí)在main協(xié)程中創(chuàng)建了一個(gè)done通道。當(dāng)worker協(xié)程完成工作后,往done通道中發(fā)送了一個(gè)true,代表通知main協(xié)程worker執(zhí)行完畢了。
開源項(xiàng)目中的應(yīng)用
接下來我們看幾個(gè)開源項(xiàng)目中的示例。
應(yīng)用一:利用通道進(jìn)行平滑關(guān)閉
在gin框架的example中,有一個(gè)關(guān)閉服務(wù)的示例,就是利用了通道來在兩個(gè)協(xié)程間進(jìn)行通訊的特性。如下:
圖片
這里就是在main協(xié)程中創(chuàng)建了一個(gè)quit通道,然后并將該quit通道傳遞給signal.Notify函數(shù),然后通過<-quit阻塞等待signal.Notify函數(shù)執(zhí)行完畢。在signal.Notify中其實(shí)是注冊(cè)并監(jiān)聽syscall.SIGTERM信號(hào),通過啟動(dòng)了一個(gè)新的協(xié)程來監(jiān)聽該信號(hào)。當(dāng)該信號(hào)發(fā)生時(shí),就往quit通道中寫入一個(gè)os.Signal的數(shù)據(jù)。
應(yīng)用二:fastcache中利用通道輸出結(jié)果
在fastcache開源項(xiàng)目中,有個(gè)功能是將數(shù)據(jù)保存到文件中。在保存函數(shù)中用到了并發(fā)保存,同時(shí)需要將每個(gè)保存的結(jié)果輸出。下面就是通過通道來接收每個(gè)協(xié)程的保存結(jié)果的功能。如下:
圖片
在上圖中,首先在save函數(shù)中初始化了一個(gè)results通道,然后將saveBuckets的結(jié)果輸出到results。在save函數(shù)的最下面,通過從results等待輸出每次saveBuckets的結(jié)果。你看,這里就是通過results通道將子協(xié)程中的結(jié)果輸出給save函數(shù)(父協(xié)程)了。
好了,今天通道的應(yīng)用案例就分享到這里了。
分享文章:GoChannel應(yīng)用:協(xié)程間信息同步
本文路徑:http://m.fisionsoft.com.cn/article/dpgscjj.html


咨詢
建站咨詢
