欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1. 前言

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

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

它的操作符是箭頭 <- 。

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

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

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

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

channel一般用于協(xié)程之間的通信,channel也可以用于并發(fā)控制。比如主協(xié)程啟動N個子協(xié)程,主協(xié)程等待所有子協(xié)程退出后再繼續(xù)后續(xù)流程,這種場景下channel也可輕易實現(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 //管道中寫入一個元素表示當(dāng)前協(xié)程已結(jié)束
}

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

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

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

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

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

2.2 總結(jié)

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

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

相關(guān)文章

  • 詳解Golang中創(chuàng)建error的方式總結(jié)與應(yīng)用場景

    詳解Golang中創(chuàng)建error的方式總結(jié)與應(yīng)用場景

    Golang中創(chuàng)建error的方式包括errors.New、fmt.Errorf、自定義實現(xiàn)了error接口的類型等,本文主要為大家介紹了這些方式的具體應(yīng)用場景,需要的可以參考一下
    2023-07-07
  • golang如何替換換行符

    golang如何替換換行符

    這篇文章主要介紹了golang如何替換換行符問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • go語言通過odbc訪問Sql Server數(shù)據(jù)庫的方法

    go語言通過odbc訪問Sql Server數(shù)據(jù)庫的方法

    這篇文章主要介紹了go語言通過odbc訪問Sql Server數(shù)據(jù)庫的方法,實例分析了Go語言通過odbc連接與查SQL Server詢數(shù)據(jù)庫的技巧,需要的朋友可以參考下
    2015-03-03
  • 深入理解golang中io.Writer接口的使用

    深入理解golang中io.Writer接口的使用

    io 是一個 Golang 標(biāo)準庫包,它為圍繞輸入和輸出的許多操作和用例定義了靈活的接口,這篇文章主要為大家介紹了Go中Writer接口的使用,需要的可以參考下
    2023-10-10
  • 完美解決golang go get私有倉庫的問題

    完美解決golang go get私有倉庫的問題

    這篇文章主要介紹了完美解決golang go get私有倉庫的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go 如何批量修改文件名

    Go 如何批量修改文件名

    這篇文章主要介紹了Go 批量修改文件名的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go語言簡介和環(huán)境配置

    Go語言簡介和環(huán)境配置

    Go語言保證了既能到達靜態(tài)編譯語言的安全和性能,又達到了動態(tài)語言開發(fā)速度和易維護性,有人形容Go語言:Go=?C?+?Python?,?說明Go語言既有C靜態(tài)語言程序的運行速度,又能達到Python動態(tài)語言的快速開發(fā),這篇文章主要介紹了Go介紹和環(huán)境配置,需要的朋友可以參考下
    2022-07-07
  • Go Java算法之單詞規(guī)律示例詳解

    Go Java算法之單詞規(guī)律示例詳解

    這篇文章主要為大家介紹了Go Java算法之單詞規(guī)律示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 使用go module導(dǎo)入本地包的方法教程詳解

    使用go module導(dǎo)入本地包的方法教程詳解

    go module 將是Go語言默認的依賴管理工具。到今天 Go1.14 版本推出之后 Go modules 功能已經(jīng)被正式推薦在生產(chǎn)環(huán)境下使用了。本文重點給大家介紹如何使用 go module 導(dǎo)入本地包,感興趣的朋友一起看看吧
    2020-03-03
  • Go 語言 JSON 標(biāo)準庫的使用

    Go 語言 JSON 標(biāo)準庫的使用

    今天通過本文給大家介紹Go 語言 JSON 標(biāo)準庫的使用小結(jié),包括序列化和反序列化的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2021-10-10

最新評論