在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用channel控制協程數量

馬哥Linux運維 ? 來源:稀土掘金技術社區 ? 作者:六號積極分子 ? 2022-09-19 15:06 ? 次閱讀

協程

goroutine 是輕量級線程,調度由 Go 運行時進行管理的。Go 語言的并發控制主要使用關鍵字 go 開啟協程 goroutine。Go 協程(Goroutine)之間通過信道(channel)進行通信,簡單的說就是多個協程之間通信的管道。信道可以防止多個協程訪問共享內存時發生資源爭搶的問題。語法格式:

// 普通函數創建 goroutinego 函數名(參數列表)
//匿名函數創建 goroutinego func(參數列表){    //函數體}(調用參數列表)

		

協程可以開啟多少個?是否有限制呢?

func testRoutine() {    var wg sync.WaitGroup    for i := 0; i < math.MaxInt32; i++ {        wg.Add(1)        go func(i int) {            defer wg.Done()            fmt.Printf("并發數量:%d/n", i)            time.Sleep(time.Second)        }(i)    }    wg.Wait()}

		

以上代碼開啟了 math.MaxInt32個協程的并發,執行后可以看到結果直接 panic:“panic: too many concurrent operations on a single file or socket (max 1048575)”。整個并發操作超出了系統最大值。

控制協程數量

sync 同步機制

使用 sync.WaitGroup 啟動指定數量的協程 goroutine。

func testRoutine() {    var wg = sync.WaitGroup{}
    taskCount := 5 // 指定并發數量    for i := 0; i < taskCount; i++ {        wg.Add(1)        go func(i int) {            fmt.Println("go func ", i)            wg.Done()        }(i)    }    wg.Wait()}

		

如果 taskcount 設置的很大超出了限制的,則其還是沒有控制到并發數量。可以優化下設計,類似池的設計思想,通過允許最大連接數控制量,當超出了數量就需要等待釋放,有空閑的連接的時候才可以繼續執行。

func testRoutine() {    task_chan := make(chan bool, 3) //100 為 channel長度    wg := sync.WaitGroup{}    defer close(task_chan)    for i := 0; i < math.MaxInt; i++ {        wg.Add(1)        fmt.Println("go func ", i)        task_chan <- true        go func() {                <-task_chan                defer wg.Done()        }()    }
    wg.Wait()}

		

  • 創建緩沖區大小為 3 的 channel,在沒有被接收的情況下,至多發送 3 個消息則被阻塞。通過 channel 控制每次并發的數量。
  • 開啟協程前,設置 task_chan <- true,若緩存區滿了則阻塞
  • 協程任務執行完成后就釋放緩沖區
  • 等待所有的并發都處理結束后則函數結束。其實可以不使用 sync.WaitGroup。因使用 channel 控制并發處理的任務數量可以不用使用等待并發處理結束。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Channel
    +關注

    關注

    0

    文章

    31

    瀏覽量

    12010
  • 線程
    +關注

    關注

    0

    文章

    507

    瀏覽量

    19987
  • go語言
    +關注

    關注

    1

    文章

    158

    瀏覽量

    9218

原文標題:使用 channel 控制并發數量

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    談談的那些事兒

    隨著異步編程的發展以及各種并發框架的普及,作為一種異步編程規范在各類語言中地位逐步提高。我們不單單會在自己的程序中使用,各類框架如fastapi,aiohttp等也都是基于異步
    的頭像 發表于 01-26 11:36 ?1262次閱讀
    談談<b class='flag-5'>協</b><b class='flag-5'>程</b>的那些事兒

    和線程有什么區別

    和線程的區別和線程的共同目的之一是實現系統資源的上下文調用,不過它們的實現層級不同;線程(Thraed)是比進程小一級的的運行單位,多線程實現系統資源上下文調用,是編程語言交付
    發表于 12-10 06:23

    Python中的多核CPU共享數據之詳解

    又稱微線程,coroutne,是一種用戶態的輕量級線程。通俗點講就是周末我在家里休息,假如我先洗漱,再煮飯,再下載電影看會很慢,用了
    的頭像 發表于 12-07 10:23 ?6785次閱讀
    Python中的多核CPU共享數據之<b class='flag-5'>協</b><b class='flag-5'>程</b>詳解

    關于C++ 20最全面詳解

    花了一兩周的時間后,我想寫寫 C++20 的基本用法,因為 C++ 的讓我感到很奇怪,寫一個
    的頭像 發表于 04-12 11:10 ?1.3w次閱讀
    關于C++ 20<b class='flag-5'>協</b><b class='flag-5'>程</b>最全面詳解

    Python后端項目的是什么

    最近公司 Python 后端項目進行重構,整個后端邏輯基本都變更為采用“異步”的方式實現。看著滿屏幕經過 async await(在 Python 中的實現)修飾的代碼,我頓時
    的頭像 發表于 09-23 14:38 ?1432次閱讀

    Python與JavaScript的對比及經驗技巧

    前言以前沒怎么接觸前端,對 JavaScript 的異步操作不了解,現在有了點了解。一查發現 Python 和 JavaScript 的發展史簡直就是一毛一樣!這里大致做下橫向對比和總結,便于
    的頭像 發表于 10-20 14:30 ?2047次閱讀

    通過例子由淺入深的理解yield

    send:send() 方法致使程前進到下一個yield 語句,另外,生成器可以作為使用
    的頭像 發表于 08-23 11:12 ?2144次閱讀

    詳解Linux線程、線程與異步編程、與異步

    不是系統級線程,很多時候被稱為“輕量級線程”、“微線程”、“纖(fiber)”等。簡單來說可以認為
    的頭像 發表于 03-16 15:49 ?1186次閱讀

    的概念及的掛起函數介紹

    是一種輕量級的線程,它可以在單個線程中實現并發執行。與線程不同,不需要操作系統的上下文切換,因此可以更高效地使用系統資源。Kotlin
    的頭像 發表于 04-19 10:20 ?1034次閱讀

    Kotlin實戰進階之筑基篇3

    的概念在1958年就開始出現(比線程還早), 目前很多語言開始原生支, Java 沒有原生但是大型公司都自己或者使用第三方庫來支持
    的頭像 發表于 05-30 16:26 ?858次閱讀

    FreeRTOS任務與介紹

    FreeRTOS 中應用既可以使用任務,也可以使用(Co-Routine),或者兩者混合使用。但是任務和協使用不同的API函數,因此不能通過隊列(或信號量)將數據從任務發送給
    的頭像 發表于 09-28 11:02 ?1131次閱讀

    的作用、結構及原理

    本文介紹了的作用、結構、原理,并使用C++和匯編實現了64位系統下的池。文章內容避免了
    的頭像 發表于 11-08 16:39 ?1414次閱讀
    <b class='flag-5'>協</b><b class='flag-5'>程</b>的作用、結構及原理

    C/C++編程的相關概念和技巧

    一、引言 的定義和背景 (Coroutine),又稱為微線程或者輕量級線程,是一種用戶態的、可在單個線程中并發執行的程序組件。
    的頭像 發表于 11-09 11:34 ?1010次閱讀

    的實現與原理

    前言 這個概念很久了,好多程序員是實現過這個組件的,網上關于的文章,博客,論壇都是汗牛充棟,在知乎,github上面也有很多大牛寫了關于
    的頭像 發表于 11-10 10:57 ?587次閱讀

    Linux線程、線程與異步編程、與異步介紹

    不是系統級線程,很多時候被稱為“輕量級線程”、“微線程”、“纖(fiber)”等。簡單來說可以認為
    的頭像 發表于 11-11 11:35 ?1410次閱讀
    Linux線程、線程與異步編程、<b class='flag-5'>協</b><b class='flag-5'>程</b>與異步介紹
    主站蜘蛛池模板: 男男浪荡双性受hplay | 天堂8资源在线官网资源 | 亚洲欧美日韩另类精品一区二区三区 | 伊人91在线 | xxⅹ丰满妇女与善交 | 久久综合亚洲 | 国产精品久久久香蕉 | www.青草视频| 日xxxx| 色男人在线 | 3344在线| 手机免费黄色网址 | 国产精品久久久久影院色老大 | 人与性www | 丁香激情综合网 | 一区| 久久久99精品免费观看精品 | 香港经典a毛片免费观看爽爽影院 | 视频在线观看一区二区 | 极品美女啪啪 | 九九精品国产兔费观看久久 | 国产色网站 | 亚洲伊人久久网 | 在线二区| 老色批影院| 恨恨操| 四虎久久影院 | 天天躁夜夜躁狠狠躁2021 | 91av在线视频观看 | 亚洲一区欧美二区 | 久久天天躁狠狠躁夜夜免费观看 | 1515hh四虎免费观38com | 午色 | 日韩高清性爽一级毛片免费 | 免费国产不卡午夜福在线观看 | 日本色图在线 | 美女黄网站人色视频免费国产 | 欧美1| 黄色视网站 | 日韩精品视频免费观看 | 特级毛片女人18毛片 |