Ist dies ein idiomatischer Worker-Thread-Pool in Go?

Ich versuche einen einfachen Arbeiterpool mit Goroutinen zu schreiben.

Ist der Code, den ich geschrieben habe, idiomatisch? Wenn nicht, was sollte sich dann ändern?Ich möchte in der Lage sein, die maximale Anzahl von Worker-Threads auf 5 festzulegen und zu blockieren, bis ein Worker verfügbar wird, wenn alle 5 beschäftigt sind. Wie würde ich dies erweitern, um nur einen Pool von maximal 5 Arbeitern zu haben? Mache ich die statischen 5 Goroutinen und gebe jedem daswork_channel?

Code

package main

import (
    "fmt"
    "math/rand"
    "sync"
    "time"
)

func worker(id string, work string, o chan string, wg *sync.WaitGroup) {
    defer wg.Done()
    sleepMs := rand.Intn(1000)
    fmt.Printf("worker '%s' received: '%s', sleep %dms\n", id, work, sleepMs)
    time.Sleep(time.Duration(sleepMs) * time.Millisecond)
    o <- work + fmt.Sprintf("-%dms", sleepMs)
}

func main() {
    var work_channel = make(chan string)
    var results_channel = make(chan string)

    // create goroutine per item in work_channel
    go func() {
        var c = 0
        var wg sync.WaitGroup
        for work := range work_channel {
            wg.Add(1)
            go worker(fmt.Sprintf("%d", c), work, results_channel, &wg)
            c++
        }
        wg.Wait()
        fmt.Println("closing results channel")
        close(results_channel)
    }()

    // add work to the work_channel
    go func() {
        for c := 'a'; c < 'z'; c++ {
            work_channel <- fmt.Sprintf("%c", c)
        }
        close(work_channel)
        fmt.Println("sent work to work_channel")
    }()

    for x := range results_channel {
        fmt.Printf("result: %s\n", x)
    }
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage