日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
GoChannel應用:協(xié)程間信息同步

大家好,我是漁夫子。

成都創(chuàng)新互聯(lián)-成都網站建設公司,專注成都網站設計、成都網站建設、網站營銷推廣,國際域名空間,網絡空間,網站托管維護有關企業(yè)網站制作方案、改版、費用等問題,請聯(lián)系成都創(chuàng)新互聯(lián)

今天給大家介紹的go channel的第二種應用:協(xié)程間同步信息。

通過channel,能夠確保一個協(xié)程在另一個協(xié)程完成工作之后才能繼續(xù)。如果需要在兩個或多個協(xié)程之間共享數(shù)據(jù)的場景中,這種用法就特別有用,并且能夠確保數(shù)據(jù)不會同時被多個協(xié)程修改非常重要。

我們先看一個簡單的示例:

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
}

在這個示例中,我們創(chuàng)建了一個worker協(xié)程,同時在main協(xié)程中創(chuàng)建了一個done通道。當worker協(xié)程完成工作后,往done通道中發(fā)送了一個true,代表通知main協(xié)程worker執(zhí)行完畢了。

開源項目中的應用

接下來我們看幾個開源項目中的示例。

應用一:利用通道進行平滑關閉

在gin框架的example中,有一個關閉服務的示例,就是利用了通道來在兩個協(xié)程間進行通訊的特性。如下:

圖片

這里就是在main協(xié)程中創(chuàng)建了一個quit通道,然后并將該quit通道傳遞給signal.Notify函數(shù),然后通過<-quit阻塞等待signal.Notify函數(shù)執(zhí)行完畢。在signal.Notify中其實是注冊并監(jiān)聽syscall.SIGTERM信號,通過啟動了一個新的協(xié)程來監(jiān)聽該信號。當該信號發(fā)生時,就往quit通道中寫入一個os.Signal的數(shù)據(jù)。

應用二:fastcache中利用通道輸出結果

在fastcache開源項目中,有個功能是將數(shù)據(jù)保存到文件中。在保存函數(shù)中用到了并發(fā)保存,同時需要將每個保存的結果輸出。下面就是通過通道來接收每個協(xié)程的保存結果的功能。如下:

圖片

在上圖中,首先在save函數(shù)中初始化了一個results通道,然后將saveBuckets的結果輸出到results。在save函數(shù)的最下面,通過從results等待輸出每次saveBuckets的結果。你看,這里就是通過results通道將子協(xié)程中的結果輸出給save函數(shù)(父協(xié)程)了。

好了,今天通道的應用案例就分享到這里了。


網站標題:GoChannel應用:協(xié)程間信息同步
本文URL:http://www.5511xx.com/article/dpgscjj.html