偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Go Channel應(yīng)用:協(xié)程間信息同步

開(kāi)發(fā) 前端
在fastcache開(kāi)源項(xiàng)目中,有個(gè)功能是將數(shù)據(jù)保存到文件中。在保存函數(shù)中用到了并發(fā)保存,同時(shí)需要將每個(gè)保存的結(jié)果輸出。下面就是通過(guò)通道來(lái)接收每個(gè)協(xié)程的保存結(jié)果的功能。

大家好,我是漁夫子。

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

通過(guò)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í)行完畢了。

開(kāi)源項(xiàng)目中的應(yīng)用

接下來(lái)我們看幾個(gè)開(kāi)源項(xiàng)目中的示例。

應(yīng)用一:利用通道進(jìn)行平滑關(guān)閉

在gin框架的example中,有一個(gè)關(guān)閉服務(wù)的示例,就是利用了通道來(lái)在兩個(gè)協(xié)程間進(jìn)行通訊的特性。如下:

圖片圖片

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

應(yīng)用二:fastcache中利用通道輸出結(jié)果

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

圖片圖片

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

好了,今天通道的應(yīng)用案例就分享到這里了。

責(zé)任編輯:武曉燕 來(lái)源: Go學(xué)堂
相關(guān)推薦

2023-07-13 08:06:05

應(yīng)用協(xié)程阻塞

2024-05-29 08:05:15

Go協(xié)程通信

2016-10-28 17:39:47

phpgolangcoroutine

2025-06-03 00:00:02

Go協(xié)程鎖機(jī)制

2018-12-04 14:00:41

協(xié)程編程模式PHP

2024-12-03 15:15:22

2021-05-21 08:21:57

Go語(yǔ)言基礎(chǔ)技術(shù)

2020-12-27 10:15:44

Go語(yǔ)言channel管道

2021-04-25 09:36:20

Go協(xié)程線程

2024-06-27 07:56:49

2025-02-28 09:04:08

2021-09-16 09:59:13

PythonJavaScript代碼

2022-10-28 10:45:22

Go協(xié)程GoFrame

2024-08-27 09:46:39

Go協(xié)程效率

2023-11-17 11:36:59

協(xié)程纖程操作系統(tǒng)

2021-09-27 23:28:29

Go多協(xié)程并發(fā)

2025-06-26 04:10:00

2023-10-24 19:37:34

協(xié)程Java

2025-02-08 09:13:40

2021-12-09 06:41:56

Python協(xié)程多并發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)