濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Go并發(fā)控制Channel使用場(chǎng)景分析

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

熱門標(biāo)簽:電腦外呼系統(tǒng)輻射大嗎 上海企業(yè)外呼系統(tǒng)排名 揚(yáng)州電銷外呼系統(tǒng)軟件 如何利用高德地圖標(biāo)注家 智能語(yǔ)音電銷的機(jī)器人 開(kāi)通400電話申請(qǐng)流程 400手機(jī)電話免費(fèi)辦理 武漢百應(yīng)人工智能電銷機(jī)器人 百度地圖標(biāo)注位置網(wǎng)站

1. 前言

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

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

它的操作符是箭頭 - 。

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

針對(duì)這種場(chǎng)景,GO提供了三種解決方案:

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

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

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

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

2.1 使用場(chǎng)景

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])      //啟動(dòng)協(xié)程,傳一個(gè)管道用于通信
    }

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

上面程序通過(guò)創(chuàng)建N個(gè)channel來(lái)管理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é)程需要定期地探測(cè)管道中是否有消息出現(xiàn)。

2.2 總結(jié)

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

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

您可能感興趣的文章:
  • Go并發(fā)控制WaitGroup的使用場(chǎng)景分析
  • Golang 實(shí)現(xiàn)分片讀取http超大文件流和并發(fā)控制
  • Go 并發(fā)控制context實(shí)現(xiàn)原理剖析(小結(jié))
  • Django Channels 實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)實(shí)時(shí)聊天和消息推送功能
  • 基于django channel實(shí)現(xiàn)websocket的聊天室的方法示例

標(biāo)簽:延邊 武漢 江西 嘉峪關(guān) 張掖 新余 黑龍江 宜賓

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go并發(fā)控制Channel使用場(chǎng)景分析》,本文關(guān)鍵詞  并發(fā),控制,Channel,使用,場(chǎng)景,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Go并發(fā)控制Channel使用場(chǎng)景分析》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Go并發(fā)控制Channel使用場(chǎng)景分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    巴楚县| 西乌珠穆沁旗| 如东县| 江北区| 尚义县| 桓台县| 绥中县| 和田市| 堆龙德庆县| 稻城县| 于田县| 杭州市| 老河口市| 冀州市| 大田县| 沁阳市| 尚义县| 福建省| 唐河县| 利津县| 安溪县| 政和县| 阿鲁科尔沁旗| 眉山市| 巴南区| 河南省| 西畴县| 长寿区| 蕉岭县| 咸阳市| 漯河市| 驻马店市| 龙南县| 包头市| 务川| 合肥市| 大兴区| 盐亭县| 华坪县| 三原县| 改则县|