关于Go中Channel和Goroutine实现工作池的问题

yinshidaoshi · · 1272 次点击
工作池的作用并不是很明显,可以理解为限制 `Goroutine` 数,好处是传递任务方便,但是我觉得写不写都一样,没啥好处,你程序里的 id 有点不必要我感觉,这个是一个工作池的写法 ```go // In this example we'll look at how to implement // a _worker pool_ using goroutines and channels. package main import "fmt" import "time" // Here's the worker, of which we'll run several // concurrent instances. These workers will receive // work on the `jobs` channel and send the corresponding // results on `results`. We'll sleep a second per job to // simulate an expensive task. func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println("worker", id, "started job", j) time.Sleep(time.Second) fmt.Println("worker", id, "finished job", j) results <- j * 2 } } func main() { // In order to use our pool of workers we need to send // them work and collect their results. We make 2 // channels for this. jobs := make(chan int, 100) results := make(chan int, 100) // This starts up 3 workers, initially blocked // because there are no jobs yet. for w := 1; w <= 3; w++ { go worker(w, jobs, results) } // Here we send 5 `jobs` and then `close` that // channel to indicate that's all the work we have. for j := 1; j <= 5; j++ { jobs <- j } close(jobs) // Finally we collect all the results of the work. for a := 1; a <= 5; a++ { <-results } } ```
#5
更多评论
哇。。。这个排版
#1
polaris
社区,需要你我一同完善!
请熟悉基本的 markdown 语法 https://studygolang.com/markdown
#2