色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

Golang根據job數量動態控制每秒協程的最大創建數量方法簡析

馬哥Linux運維 ? 來源:稀土掘金 ? 2023-12-24 14:21 ? 次閱讀

需求:第三方的接口,限制接口請求的QPS,每秒5次

需要控制job「訪問接口」的次數,每秒不能同時超過5次,包括 進行中的任務、剛啟動的任務

要確保單位時間內(例如每秒)運行的任務數量不超過特定的上限(如5個任務),并且在任務執行完成得很快時,考慮已完成的任務和正在執行的任務作為正在運行的任務總數,可以使用限流器來控制任務的啟動頻率,并結合使用信號量來管理同時運行的任務數量。

具體來說,使用一個信號量來限制同時進行的任務數量,并且在任務完成時,僅在下一秒鐘允許新的任務開始,以確保即使某些任務快速完成,也不會在同一秒鐘內啟動超過限制數量的任務

package main


import (
    "context"
    "fmt"
    "math/rand"
    "sync"
    "sync/atomic"
    "time"


    "golang.org/x/time/rate"
)


func RateLimit() {
    const maxJobsPerSecond = 5
    const numJobs = 22
    var wg sync.WaitGroup


    // 計數器
    var runningJobs int32 // 當前正在執行的任務數量
    var startedJobs int32 // 啟動后的任務數量
    var finishedJobs int32 // 剛完成的任務數量


    limiter := rate.NewLimiter(rate.Every(time.Second/time.Duration(maxJobsPerSecond)), maxJobsPerSecond)
    semaphore := make(chan struct{}, maxJobsPerSecond)


    for i := 1; i <= numJobs; i++ {
        wg.Add(1)
        go func(jobID int) {
            defer wg.Done()
            limiter.Wait(context.Background()) // 等待限流器允許進行下一個任務


            semaphore <- struct{}{} // 獲取信號量
            atomic.AddInt32(&startedJobs, 1)
            atomic.AddInt32(&runningJobs, 1)


            executeJob(jobID) // 執行任務
            atomic.AddInt32(&finishedJobs, 1)
            atomic.AddInt32(&runningJobs, -1)


            <-time.After(time.Second) // 等待一秒鐘后釋放信號量
            <-semaphore


            // 打印當前狀態
            printStatus(&runningJobs, &startedJobs, &finishedJobs)
        }(i)
    }


    wg.Wait()
    fmt.Println("所有工作完成")
}

注意事項

限流器rate.NewLimiter用于控制任務啟動的頻率,以確保每秒不超過maxJobsPerSecond個任務開始執行。

使用信號量semaphore來控制同時進行的任務數量。

為了確保在任何一秒內同時進行的任務數量不超過限制,在任務完成后等待一秒鐘,然后再釋放信號量。這樣做可以保證即使任務很快完成,也不會立即啟動新的任務。

這種實現方式確保了即使任務執行得很快,每秒鐘啟動的新任務數量也不會超過限制,并且同時考慮了正在執行和剛剛完成的任務。

動態創建協程

協程的啟動是動態的。在代碼中,每個任務對應于一個動態創建的協程。這些協程是在循環中根據任務數量(numJobs)動態生成的。

具體來說,每當有一個新的任務需要執行時,都會創建一個新的協程來處理這個任務。這是通過在main函數的循環中調用go關鍵字實現的。這個過程在每次循環迭代中發生,從而為每個任務動態創建一個新的協程

由于使用了限流器(rate.Limiter),這些協程不是一次性全部創建,而是根據限流器允許的速率逐個創建。每個協程在開始執行任務之前會等待限流器的許可,以此確保每秒啟動的任務數量不超過設定的最大值

func executeJob(jobID int) {
  startTime := time.Now() // 記錄任務開始時間
  
    // 模擬任務執行時間
    fmt.Printf("%v Job %d started
",time.Now().Format("2006-01-02 1505.000"), jobID)
  // 初始化隨機數種子
  rand.Seed(time.Now().UnixNano())
  // 隨機生成一個時間間隔(例如,1到5000毫秒之間)
  min := 1
  max := 5000
  duration := time.Duration(rand.Intn(max-min+1)+min) * time.Millisecond
  time.Sleep(duration)


  durationCost := time.Since(startTime) // 計算任務耗時


    fmt.Printf("%v Job %d finished Cost:%v
", time.Now().Format("2006-01-02 1505.000"),jobID, durationCost)
}


func printStatus(runningJobs, startedJobs, finishedJobs *int32) {
    fmt.Printf("Current status - Running: %d, Started: %d, Finished: %d
",
        atomic.LoadInt32(runningJobs),
        atomic.LoadInt32(startedJobs),
        atomic.LoadInt32(finishedJobs))
}

可以在代碼中添加額外的邏輯來跟蹤和打印正在執行、進行中、剛啟動和剛完成的任務數量。使用原子操作(來自sync/atomic包)來確保在并發環境下對這些計數器的操作是安全的。

在這個示例中:

使用sync/atomic包中的AddInt32和LoadInt32來安全地增加和讀取計數器的值。

在每個任務開始時,增加startedJobs和runningJobs計數器。

在每個任務完成時,增加finishedJobs計數器,并減少runningJobs計數器。

在任務完成后和釋放信號量前,打印當前的任務狀態。

注意事項

這種方法可以幫助我們跟蹤不同狀態下的任務數量。

使用原子操作確保在并發環境中對計數器的讀寫是安全的。

printStatus函數在每個任務的結束時被調用,以打印當前的任務狀態

鏈接:https://juejin.cn/post/7315314479204696079








審核編輯:劉清

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

    關注

    0

    文章

    41

    瀏覽量

    14509
  • QPS
    QPS
    +關注

    關注

    0

    文章

    24

    瀏覽量

    8820

原文標題:Golang根據job數量動態控制每秒協程的最大創建數量方法

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

收藏 人收藏

    評論

    相關推薦

    談談的那些事兒

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

    采用COT穩壓器動態控制輸出電壓

    輸入來達到這一任務目的,但是大多數寬泛 VIN 轉換器都不提供。在這篇博客文章中,我將討論一種通過反饋引腳動態控制 DC/DC 轉換器輸出電壓的通用方法。COT 轉換器非常適合可變輸出電壓應用,因為
    發表于 09-19 11:01

    什么是多任務系統?FreeRTOS任務與

    功能,初學者必須先掌握——任務的創建、刪除、掛起和恢復等操作。本章節分為如下幾部分:*什么是多任務系統*FreeRTOS任務與*初次使用*任務狀態*任務優先級*任務實現*任務控制
    發表于 02-18 06:38

    如何最大限度減小電源設計中輸出電容的數量和尺寸?

    電源輸出電容一般是100 nF至100 μF的陶瓷電容,它們耗費資金,占用空間,而且,在遇到交付瓶頸的時候還會難以獲得。所以,如何最大限度減小輸出電容的數量和尺寸,這個問題反復被提及。 輸出電容造成
    發表于 03-21 14:42

    如何最大限度減小電源設計中輸出電容的數量和尺寸

    電源輸出電容一般是100 nF至100 μF的陶瓷電容,它們耗費資金,占用空間,而且,在遇到交付瓶頸的時候還會難以獲得。所以,如何最大限度減小輸出電容的數量和尺寸,這個問題反復被提及。輸出電容造成
    發表于 06-14 10:19

    基于多步預測性能指標函數的神經網絡逆動態控制方法

    神經網絡逆動態控制作為神經網絡控制領域中一種重要的控制方法,通過建立對象的逆動態模型從而實現對象輸出完全跟蹤給定輸入的理想
    發表于 12-20 15:15 ?2次下載

    最大處理器數量

    最大處理器數量          
    發表于 12-17 11:03 ?340次閱讀

    PCI插槽最大數量

    PCI插槽最大數量         
    發表于 12-26 16:09 ?678次閱讀

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

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

    使用channel控制數量

    goroutine 是輕量級線程,調度由 Go 運行時進行管理的。Go 語言的并發控制主要使用關鍵字 go 開啟 goroutine。Go
    的頭像 發表于 09-19 15:06 ?1166次閱讀

    5G AAU 功放控制和監測模塊

    5G AAU 功放控制和監測模塊
    發表于 10-28 12:00 ?2次下載
    5G AAU 功放<b class='flag-5'>控制</b>和監測模塊<b class='flag-5'>簡</b><b class='flag-5'>析</b>

    如何采用 COT 穩壓器動態控制輸出電壓

    如何采用 COT 穩壓器動態控制輸出電壓
    發表于 11-07 08:07 ?0次下載
    如何采用 COT 穩壓器<b class='flag-5'>動態控制</b>輸出電壓

    的概念及的掛起函數介紹

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

    單片機實現爐溫動態控制

    電子發燒友網站提供《單片機實現爐溫動態控制.pdf》資料免費下載
    發表于 10-12 09:48 ?0次下載
    單片機實現爐溫<b class='flag-5'>動態控制</b>

    何選擇一個合適的來獲得CPU執行權

    如今雖不敢說已經是紅的發紫,但確實是越來越受到了大家的重視。Golang中的已經是只有goroutine,以至于很多go程序員是只知有
    的頭像 發表于 11-13 14:10 ?435次閱讀
    何選擇一個合適的<b class='flag-5'>協</b><b class='flag-5'>程</b>來獲得CPU執行權
    主站蜘蛛池模板: 影音先锋男人av橹橹色| 中文字幕一区二区三区在线播放| 亚洲欧美一区二区三区四区| 成人18视频在线观看| 嫩草成人影院| 99视频福利| 欧美亚洲另类图片| 潮 喷女王cytherea| 人妻体内射精一区二区| 波多野结衣 无码片| 色哦色哦哦色天天综合| 高清毛片一区二区三区| 四虎国产精品免费观看视频| 春暖花开 性 欧洲| 无码国产精品高潮久久9| 国产小视频国产精品| 亚洲人成在线播放无码| 精品 在线 视频 亚洲| 一道本av免费不卡播放| 久久久无码精品亚洲日韩按摩| 中文字幕 亚洲 有码 在线 | 99久久免费精品国产| 清冷受被CAO的合不拢| 国产成人综合网在线观看| 亚洲精品久久久无码AV片软件| 九九热免费在线观看| 97国产精品人妻无码免费| 日本高清不卡一区久久精品| 国产成人综合视频| 云南14学生真实初次破初视频| 免费在线看视频| 国产69精品久久久久乱码韩国| 亚洲 视频 在线 国产 精品| 久久精品天天中文字幕| SAO货腿张开JI巴CAO死我| 文中字幕一区二区三区视频播放| 娇小萝被两个黑人用半米长| 99免费视频观看| 亚洲 日韩 自拍 视频一区| 玛雅成人网| 国产精品伊人|