1 回答

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/
- 1 回答
- 0 關(guān)注
- 139 瀏覽
添加回答
舉報(bào)