最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go并發(fā)控制Channel使用場景分析

 更新時(shí)間:2021年07月12日 09:07:00   作者:failymao  
使用channel來控制子協(xié)程的優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,缺點(diǎn)是當(dāng)需要大量創(chuàng)建協(xié)程時(shí)就需要有相同數(shù)量的channel,而且對于子協(xié)程繼續(xù)派生出來的協(xié)程不方便控制

1. 前言

channel一個(gè)類型管道,通過它可以在goroutine之間發(fā)送和接收消息。它是Golang在語言層面提供的goroutine間的通信方式。

Channel是Go中的一個(gè)核心類型,你可以把它看成一個(gè)管道,通過它并發(fā)核心單元就可以發(fā)送或者接收數(shù)據(jù)進(jìn)行通訊(communication)。

它的操作符是箭頭 <- 。

我們考慮這么一種場景,協(xié)程A執(zhí)行過程中需要創(chuàng)建子協(xié)程A1、A2、A3…An,協(xié)程A創(chuàng)建完子協(xié)程后就等待子協(xié)程退出。

針對這種場景,GO提供了三種解決方案:

  • Channel: 使用channel控制子協(xié)程
  • WaitGroup : 使用信號量機(jī)制控制子協(xié)程
  • Context: 使用上下文控制子協(xié)程

三種方案各有優(yōu)劣,比如Channel優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,清晰易懂,WaitGroup優(yōu)點(diǎn)是子協(xié)程個(gè)數(shù)動態(tài)可調(diào)整,Context優(yōu)點(diǎn)是對子協(xié)程派生出來的孫子協(xié)程的控制。
缺點(diǎn)是相對而言的,要結(jié)合實(shí)例應(yīng)用場景進(jìn)行選擇。

channel一般用于協(xié)程之間的通信,channel也可以用于并發(fā)控制。比如主協(xié)程啟動N個(gè)子協(xié)程,主協(xié)程等待所有子協(xié)程退出后再繼續(xù)后續(xù)流程,這種場景下channel也可輕易實(shí)現(xiàn)。

2. 使用channel控制子協(xié)程

2.1 使用場景

package main

import (
    "time"
    "fmt"
)

func Process(ch chan int) {
    //Do some work...
    time.Sleep(time.Second)

    ch <- 1 //管道中寫入一個(gè)元素表示當(dāng)前協(xié)程已結(jié)束
}

func main() {
    channels := make([]chan int, 10) //創(chuàng)建一個(gè)10個(gè)元素的切片,元素類型為channel

    for i:= 0; i < 10; i++ {
        channels[i] = make(chan int) //切片中放入一個(gè)channel
        go Process(channels[i])      //啟動協(xié)程,傳一個(gè)管道用于通信
    }

    for i, ch := range channels {  //遍歷切片,等待子協(xié)程結(jié)束
        <-ch
        fmt.Println("Routine ", i, " quit!")
    }
}

上面程序通過創(chuàng)建N個(gè)channel來管理N個(gè)協(xié)程,每個(gè)協(xié)程都有一個(gè)channel用于跟父協(xié)程通信,父協(xié)程創(chuàng)建完所有協(xié)程后等待所有協(xié)程結(jié)束。

這個(gè)例子中,父協(xié)程僅僅是等待子協(xié)程結(jié)束,其實(shí)父協(xié)程也可以向管道中寫入數(shù)據(jù)通知子協(xié)程結(jié)束,這時(shí)子協(xié)程需要定期地探測管道中是否有消息出現(xiàn)。

2.2 總結(jié)

使用channel來控制子協(xié)程的優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,缺點(diǎn)是當(dāng)需要大量創(chuàng)建協(xié)程時(shí)就需要有相同數(shù)量的channel,而且對于子協(xié)程繼續(xù)派生出來的協(xié)程不方便控制。

到此這篇關(guān)于Go并發(fā)控制Channel使用場景分析的文章就介紹到這了,更多相關(guān)Go并發(fā)控制Channel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go Excelize API源碼閱讀GetPageLayout及SetPageMargins

    Go Excelize API源碼閱讀GetPageLayout及SetPageMargins

    這篇文章主要為大家介紹了Go Excelize API源碼閱讀GetPageLayout及SetPageMargins的方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 減少 golang 二進(jìn)制文件大小操作

    減少 golang 二進(jìn)制文件大小操作

    這篇文章主要介紹了減少 golang 二進(jìn)制文件大小操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 如何解決goland,idea全局搜索快捷鍵失效問題

    如何解決goland,idea全局搜索快捷鍵失效問題

    這篇文章主要介紹了如何解決goland,idea全局搜索快捷鍵失效問題,快捷鍵失效,可能是快捷鍵沖突,也或者是快捷鍵被修改成其他了。在settings下查看快捷鍵是否被修改,下文詳細(xì)介紹需要的朋友可以參考下
    2022-04-04
  • RabbitMq如何做到消息的可靠性投遞

    RabbitMq如何做到消息的可靠性投遞

    現(xiàn)在的一些互聯(lián)網(wǎng)項(xiàng)目或者是高并發(fā)的項(xiàng)目中很少有沒有引入消息隊(duì)列的。 引入消息隊(duì)列可以給這個(gè)項(xiàng)目帶來很多的好處,這篇文章主要為大家介紹了RabbitMq如何做到消息的可靠性投遞,有需要的朋友可以借鑒參考下
    2022-12-12
  • Go語言自定義包構(gòu)建自己的編程工具庫

    Go語言自定義包構(gòu)建自己的編程工具庫

    Go 語言的強(qiáng)大不僅體現(xiàn)在其內(nèi)置功能上,還在于其支持自定義包,這為開發(fā)者提供了極大的靈活性和可擴(kuò)展性,本文將深入介紹如何創(chuàng)建、使用和管理自定義包,探索 Go 語言包的奧秘,打造屬于你的編程工具庫
    2023-11-11
  • Go設(shè)計(jì)模式之狀態(tài)模式講解和代碼示例

    Go設(shè)計(jì)模式之狀態(tài)模式講解和代碼示例

    狀態(tài)是一種行為設(shè)計(jì)模式,?讓你能在一個(gè)對象的內(nèi)部狀態(tài)變化時(shí)改變其行為,該模式將與狀態(tài)相關(guān)的行為抽取到獨(dú)立的狀態(tài)類中,?讓原對象將工作委派給這些類的實(shí)例,?而不是自行進(jìn)行處理,本文將通過代碼示例給大家簡單的介紹一下Go狀態(tài)模式
    2023-08-08
  • Golang簡單實(shí)現(xiàn)http的server端和client端

    Golang簡單實(shí)現(xiàn)http的server端和client端

    Http 服務(wù)是基于 Tcp 的應(yīng)用層的實(shí)現(xiàn),也是最常見的網(wǎng)絡(luò)協(xié)議之一。本文主要介紹了Golang簡單實(shí)現(xiàn)http的server端和client端,感興趣的可以了解一下
    2021-06-06
  • Go?interface{}?轉(zhuǎn)切片類型的實(shí)現(xiàn)方法

    Go?interface{}?轉(zhuǎn)切片類型的實(shí)現(xiàn)方法

    本文主要介紹了Go?interface{}?轉(zhuǎn)切片類型的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • GO語言實(shí)現(xiàn)二維碼掃碼的示例代碼

    GO語言實(shí)現(xiàn)二維碼掃碼的示例代碼

    你對二維碼掃碼的流程有困惑嗎,這篇文章就結(jié)合筆者自身的開發(fā)經(jīng)驗(yàn)進(jìn)行分享,讓大家熟悉并掌握此功能,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2023-06-06
  • golang實(shí)現(xiàn)多協(xié)程下載文件(支持?jǐn)帱c(diǎn)續(xù)傳)

    golang實(shí)現(xiàn)多協(xié)程下載文件(支持?jǐn)帱c(diǎn)續(xù)傳)

    本文主要介紹了golang實(shí)現(xiàn)多協(xié)程下載文件,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論

盈江县| 永平县| 分宜县| 吉隆县| 游戏| 台山市| 望奎县| 镇安县| 瓦房店市| 长丰县| 江津市| 宣威市| 伊通| 大同市| 龙泉市| 瑞昌市| 蒙城县| 邵武市| 松阳县| 万载县| 孟州市| 永安市| 明水县| 开原市| 卓资县| 安西县| 勐海县| 滕州市| 永清县| 广南县| 鹿邑县| 阜宁县| 平利县| 城口县| 彭泽县| 青阳县| 吴忠市| 日照市| 天台县| 曲周县| 南平市|