第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Golang http 服務(wù)器實(shí)現(xiàn)

Golang http 服務(wù)器實(shí)現(xiàn)

Go
牛魔王的故事 2022-01-17 16:40:53
我讀過(guò) net/http 為每個(gè)連接啟動(dòng)一個(gè) go 子例程。我有幾個(gè)問(wèn)題。但是我還沒(méi)有看到任何參數(shù)來(lái)限制生成的新 go 子例程的數(shù)量。例如,如果我必須每秒處理 100 萬(wàn)個(gè)并發(fā)請(qǐng)求,會(huì)發(fā)生什么?我們是否可以控制生成的 go 子例程?如果它為每個(gè)連接生成一個(gè) go 子例程,它不會(huì)阻塞我的整個(gè)系統(tǒng)嗎?為 Go 網(wǎng)絡(luò)服務(wù)器處理大量并發(fā)請(qǐng)求的推薦方法是什么?我必須處理異步和同步兩種響應(yīng)情況。
查看完整描述

1 回答

?
幕布斯6054654

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊

Job/Worker 模式是適用于此任務(wù)的常見(jiàn) go 并發(fā)模式。


多個(gè) goroutine 可以從單個(gè)通道讀取,在 CPU 內(nèi)核之間分配大量工作,因此是工作程序的名稱。在 Go 中,這種模式很容易實(shí)現(xiàn)——只需啟動(dòng)多個(gè)以通道為參數(shù)的 goroutine,然后將值發(fā)送到該通道——分發(fā)和多路復(fù)用將由 Go 運(yùn)行時(shí)完成。


package main


import (

    "fmt"

    "sync"

    "time"

)


func worker(tasksCh <-chan int, wg *sync.WaitGroup) {

    defer wg.Done()

    for {

        task, ok := <-tasksCh

        if !ok {

            return

        }

        d := time.Duration(task) * time.Millisecond

        time.Sleep(d)

        fmt.Println("processing task", task)

    }

}


func pool(wg *sync.WaitGroup, workers, tasks int) {

    tasksCh := make(chan int)


    for i := 0; i < workers; i++ {

        go worker(tasksCh, wg)

    }


    for i := 0; i < tasks; i++ {

        tasksCh <- i

    }


    close(tasksCh)

}


func main() {

    var wg sync.WaitGroup

    wg.Add(36)

    go pool(&wg, 36, 50)

    wg.Wait()

}

所有的 goroutine 并行運(yùn)行,等待通道給它們工作。goroutine 幾乎是一個(gè)接一個(gè)地立即接收它們的工作。


這是一篇關(guān)于如何在 go 中每分鐘處理 100 萬(wàn)個(gè)請(qǐng)求的精彩文章:http: //marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/


查看完整回答
反對(duì) 回復(fù) 2022-01-17
  • 1 回答
  • 0 關(guān)注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)