日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
GoChannel應(yīng)用系列之控制協(xié)程數(shù)量

大家好,我是漁夫子。

創(chuàng)新互聯(lián)從2013年創(chuàng)立,先為孟州等服務(wù)建站,孟州等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為孟州企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

今天給大家介紹一下如何利用go中的緩沖channel來控制協(xié)程的數(shù)量。如下示例:

package main

import (
    "fmt"
    "sync/atomic"
)

func main() {
    sem := make(chan struct{}, 10)
    var count int32
    for {
       //time.Sleep(5*time.Millisecond)
       go func() {
          sem <- struct{}{}
          atomic.AddInt32(&count, 1)
          defer func() {
             <-sem
             atomic.AddInt32(&count, -1)
         }()

          fmt.Printf("count is :%d\n", count)
      }()
   }
    
}

在這個示例中,我們首先在for外層初始化了一個緩沖channel:sem,該channel可以存放10個元素。在for循環(huán)中我們不停的啟動協(xié)程。在協(xié)程中我們嘗試往sem中發(fā)送元素,如果發(fā)送成功,就運(yùn)行后面的邏輯,如果發(fā)送不成功,即sem空間已經(jīng)滿了,就利用channel的堵塞特性,該協(xié)程在這里堵塞等待。最后等某個協(xié)程運(yùn)行完畢后,從通道sem中輸出一個元素,這樣就騰出來一個空間,讓堵塞的一個協(xié)程繼續(xù)運(yùn)行了。

這樣,我們在for循環(huán)中雖然一直在不停的啟用協(xié)程,但能夠運(yùn)行的協(xié)程數(shù)量不會超過10個。這樣利用了通道的阻塞特定,不用加鎖就能實現(xiàn)控制協(xié)程數(shù)量的目的。

應(yīng)用示例

在之前我們推薦過一個爬蟲的開源項目:Geziyor。這個項目中就使用了這種方式來控制并發(fā)請求的數(shù)量。我們看下源代碼:首先,在初始化的地方,先根據(jù)并發(fā)個數(shù)來初始化了一個緩沖通道,示例代碼看源碼第109行

圖片

然后,在Start函數(shù)中,循環(huán)啟動每一個采集的任務(wù)。源代碼中的106行Start函數(shù),如下:

圖片

然后,在源代碼的第220行,則啟動任務(wù)協(xié)程,在任務(wù)協(xié)程中首先通過acquireSem函數(shù)往通道中發(fā)送一個消息,如果發(fā)送不成功就堵塞在這里,直到其他協(xié)程通過releaseSem釋放通道中的一個空間出來。如下:

圖片

好了,今天緩沖通道的其中應(yīng)用場景就分享到這里。


網(wǎng)頁名稱:GoChannel應(yīng)用系列之控制協(xié)程數(shù)量
地址分享:http://m.5511xx.com/article/dpeigpc.html