女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Golang根據(jù)job數(shù)量動(dòng)態(tài)控制每秒?yún)f(xié)程的最大創(chuàng)建數(shù)量方法簡(jiǎn)析

馬哥Linux運(yùn)維 ? 來(lái)源:稀土掘金 ? 2023-12-24 14:21 ? 次閱讀

需求:第三方的接口,限制接口請(qǐng)求的QPS,每秒5次

需要控制job「訪問(wèn)接口」的次數(shù),每秒不能同時(shí)超過(guò)5次,包括 進(jìn)行中的任務(wù)、剛啟動(dòng)的任務(wù)

要確保單位時(shí)間內(nèi)(例如每秒)運(yùn)行的任務(wù)數(shù)量不超過(guò)特定的上限(如5個(gè)任務(wù)),并且在任務(wù)執(zhí)行完成得很快時(shí),考慮已完成的任務(wù)和正在執(zhí)行的任務(wù)作為正在運(yùn)行的任務(wù)總數(shù),可以使用限流器來(lái)控制任務(wù)的啟動(dòng)頻率,并結(jié)合使用信號(hào)量來(lái)管理同時(shí)運(yùn)行的任務(wù)數(shù)量。

具體來(lái)說(shuō),使用一個(gè)信號(hào)量來(lái)限制同時(shí)進(jìn)行的任務(wù)數(shù)量,并且在任務(wù)完成時(shí),僅在下一秒鐘允許新的任務(wù)開(kāi)始,以確保即使某些任務(wù)快速完成,也不會(huì)在同一秒鐘內(nèi)啟動(dòng)超過(guò)限制數(shù)量的任務(wù)

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


    // 計(jì)數(shù)器
    var runningJobs int32 // 當(dāng)前正在執(zhí)行的任務(wù)數(shù)量
    var startedJobs int32 // 啟動(dòng)后的任務(wù)數(shù)量
    var finishedJobs int32 // 剛完成的任務(wù)數(shù)量


    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()) // 等待限流器允許進(jìn)行下一個(gè)任務(wù)


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


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


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


            // 打印當(dāng)前狀態(tài)
            printStatus(&runningJobs, &startedJobs, &finishedJobs)
        }(i)
    }


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

注意事項(xiàng)

限流器rate.NewLimiter用于控制任務(wù)啟動(dòng)的頻率,以確保每秒不超過(guò)maxJobsPerSecond個(gè)任務(wù)開(kāi)始執(zhí)行。

使用信號(hào)量semaphore來(lái)控制同時(shí)進(jìn)行的任務(wù)數(shù)量。

為了確保在任何一秒內(nèi)同時(shí)進(jìn)行的任務(wù)數(shù)量不超過(guò)限制,在任務(wù)完成后等待一秒鐘,然后再釋放信號(hào)量。這樣做可以保證即使任務(wù)很快完成,也不會(huì)立即啟動(dòng)新的任務(wù)。

這種實(shí)現(xiàn)方式確保了即使任務(wù)執(zhí)行得很快,每秒鐘啟動(dòng)的新任務(wù)數(shù)量也不會(huì)超過(guò)限制,并且同時(shí)考慮了正在執(zhí)行和剛剛完成的任務(wù)。

動(dòng)態(tài)創(chuàng)建協(xié)程

協(xié)程的啟動(dòng)是動(dòng)態(tài)的。在代碼中,每個(gè)任務(wù)對(duì)應(yīng)于一個(gè)動(dòng)態(tài)創(chuàng)建的協(xié)程。這些協(xié)程是在循環(huán)中根據(jù)任務(wù)數(shù)量(numJobs)動(dòng)態(tài)生成的。

具體來(lái)說(shuō),每當(dāng)有一個(gè)新的任務(wù)需要執(zhí)行時(shí),都會(huì)創(chuàng)建一個(gè)新的協(xié)程來(lái)處理這個(gè)任務(wù)。這是通過(guò)在main函數(shù)的循環(huán)中調(diào)用go關(guān)鍵字實(shí)現(xiàn)的。這個(gè)過(guò)程在每次循環(huán)迭代中發(fā)生,從而為每個(gè)任務(wù)動(dòng)態(tài)創(chuàng)建一個(gè)新的協(xié)程

由于使用了限流器(rate.Limiter),這些協(xié)程不是一次性全部創(chuàng)建,而是根據(jù)限流器允許的速率逐個(gè)創(chuàng)建。每個(gè)協(xié)程在開(kāi)始執(zhí)行任務(wù)之前會(huì)等待限流器的許可,以此確保每秒啟動(dòng)的任務(wù)數(shù)量不超過(guò)設(shè)定的最大值

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


  durationCost := time.Since(startTime) // 計(jì)算任務(wù)耗時(shí)


    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))
}

可以在代碼中添加額外的邏輯來(lái)跟蹤和打印正在執(zhí)行、進(jìn)行中、剛啟動(dòng)和剛完成的任務(wù)數(shù)量。使用原子操作(來(lái)自sync/atomic包)來(lái)確保在并發(fā)環(huán)境下對(duì)這些計(jì)數(shù)器的操作是安全的。

在這個(gè)示例中:

使用sync/atomic包中的AddInt32和LoadInt32來(lái)安全地增加和讀取計(jì)數(shù)器的值。

在每個(gè)任務(wù)開(kāi)始時(shí),增加startedJobs和runningJobs計(jì)數(shù)器。

在每個(gè)任務(wù)完成時(shí),增加finishedJobs計(jì)數(shù)器,并減少runningJobs計(jì)數(shù)器。

在任務(wù)完成后和釋放信號(hào)量前,打印當(dāng)前的任務(wù)狀態(tài)。

注意事項(xiàng)

這種方法可以幫助我們跟蹤不同狀態(tài)下的任務(wù)數(shù)量。

使用原子操作確保在并發(fā)環(huán)境中對(duì)計(jì)數(shù)器的讀寫(xiě)是安全的。

printStatus函數(shù)在每個(gè)任務(wù)的結(jié)束時(shí)被調(diào)用,以打印當(dāng)前的任務(wù)狀態(tài)

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








審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 限流器
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    14645
  • QPS
    QPS
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    8920

原文標(biāo)題:Golang根據(jù)job數(shù)量動(dòng)態(tài)控制每秒?yún)f(xié)程的最大創(chuàng)建數(shù)量方法

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    談?wù)?b class='flag-5'>協(xié)的那些事兒

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

    采用COT穩(wěn)壓器動(dòng)態(tài)控制輸出電壓

    輸入來(lái)達(dá)到這一任務(wù)目的,但是大多數(shù)寬泛 VIN 轉(zhuǎn)換器都不提供。在這篇博客文章中,我將討論一種通過(guò)反饋引腳動(dòng)態(tài)控制 DC/DC 轉(zhuǎn)換器輸出電壓的通用方法。COT 轉(zhuǎn)換器非常適合可變輸出電壓應(yīng)用,因?yàn)?/div>
    發(fā)表于 09-19 11:01

    什么是多任務(wù)系統(tǒng)?FreeRTOS任務(wù)與協(xié)簡(jiǎn)

    功能,初學(xué)者必須先掌握——任務(wù)的創(chuàng)建、刪除、掛起和恢復(fù)等操作。本章節(jié)分為如下幾部分:*什么是多任務(wù)系統(tǒng)*FreeRTOS任務(wù)與協(xié)*初次使用*任務(wù)狀態(tài)*任務(wù)優(yōu)先級(jí)*任務(wù)實(shí)現(xiàn)*任務(wù)控制
    發(fā)表于 02-18 06:38

    如何最大限度減小電源設(shè)計(jì)中輸出電容的數(shù)量和尺寸?

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

    如何最大限度減小電源設(shè)計(jì)中輸出電容的數(shù)量和尺寸

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

    基于多步預(yù)測(cè)性能指標(biāo)函數(shù)的神經(jīng)網(wǎng)絡(luò)逆動(dòng)態(tài)控制方法

    神經(jīng)網(wǎng)絡(luò)逆動(dòng)態(tài)控制作為神經(jīng)網(wǎng)絡(luò)控制領(lǐng)域中一種重要的控制方法,通過(guò)建立對(duì)象的逆動(dòng)態(tài)模型從而實(shí)現(xiàn)對(duì)象輸出完全跟蹤給定輸入的理想
    發(fā)表于 12-20 15:15 ?2次下載

    最大處理器數(shù)量

    最大處理器數(shù)量          
    發(fā)表于 12-17 11:03 ?353次閱讀

    PCI插槽最大數(shù)量

    PCI插槽最大數(shù)量         
    發(fā)表于 12-26 16:09 ?706次閱讀

    通過(guò)例子由淺入深的理解yield協(xié)

    send:send() 方法致使協(xié)程前進(jìn)到下一個(gè)yield 語(yǔ)句,另外,生成器可以作為協(xié)使用
    的頭像 發(fā)表于 08-23 11:12 ?2220次閱讀

    使用channel控制協(xié)數(shù)量

    goroutine 是輕量級(jí)線程,調(diào)度由 Go 運(yùn)行時(shí)進(jìn)行管理的。Go 語(yǔ)言的并發(fā)控制主要使用關(guān)鍵字 go 開(kāi)啟協(xié) goroutine。Go 協(xié)
    的頭像 發(fā)表于 09-19 15:06 ?1306次閱讀

    5G AAU 功放控制和監(jiān)測(cè)模塊簡(jiǎn)

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

    如何采用 COT 穩(wěn)壓器動(dòng)態(tài)控制輸出電壓

    如何采用 COT 穩(wěn)壓器動(dòng)態(tài)控制輸出電壓
    發(fā)表于 11-07 08:07 ?0次下載
    如何采用 COT 穩(wěn)壓器<b class='flag-5'>動(dòng)態(tài)控制</b>輸出電壓

    協(xié)的概念及協(xié)的掛起函數(shù)介紹

    協(xié)是一種輕量級(jí)的線程,它可以在單個(gè)線程中實(shí)現(xiàn)并發(fā)執(zhí)行。與線程不同,協(xié)不需要操作系統(tǒng)的上下文切換,因此可以更高效地使用系統(tǒng)資源。Kotlin 協(xié)
    的頭像 發(fā)表于 04-19 10:20 ?1105次閱讀

    單片機(jī)實(shí)現(xiàn)爐溫動(dòng)態(tài)控制

    電子發(fā)燒友網(wǎng)站提供《單片機(jī)實(shí)現(xiàn)爐溫動(dòng)態(tài)控制.pdf》資料免費(fèi)下載
    發(fā)表于 10-12 09:48 ?0次下載
    單片機(jī)實(shí)現(xiàn)爐溫<b class='flag-5'>動(dòng)態(tài)控制</b>

    何選擇一個(gè)合適的協(xié)來(lái)獲得CPU執(zhí)行權(quán)

    如今雖不敢說(shuō)協(xié)已經(jīng)是紅的發(fā)紫,但確實(shí)是越來(lái)越受到了大家的重視。Golang中的已經(jīng)是只有g(shù)oroutine,以至于很多go程序員是只知有協(xié)
    的頭像 發(fā)表于 11-13 14:10 ?556次閱讀
    何選擇一個(gè)合適的<b class='flag-5'>協(xié)</b><b class='flag-5'>程</b>來(lái)獲得CPU執(zhí)行權(quán)