亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang http 服務器實現

Golang http 服務器實現

Go
牛魔王的故事 2022-01-17 16:40:53
我讀過 net/http 為每個連接啟動一個 go 子例程。我有幾個問題。但是我還沒有看到任何參數來限制生成的新 go 子例程的數量。例如,如果我必須每秒處理 100 萬個并發請求,會發生什么?我們是否可以控制生成的 go 子例程?如果它為每個連接生成一個 go 子例程,它不會阻塞我的整個系統嗎?為 Go 網絡服務器處理大量并發請求的推薦方法是什么?我必須處理異步和同步兩種響應情況。
查看完整描述

1 回答

?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

Job/Worker 模式是適用于此任務的常見 go 并發模式。


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


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 并行運行,等待通道給它們工作。goroutine 幾乎是一個接一個地立即接收它們的工作。


這是一篇關于如何在 go 中每分鐘處理 100 萬個請求的精彩文章:http: //marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/


查看完整回答
反對 回復 2022-01-17
  • 1 回答
  • 0 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號