Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
61 lines (45 sloc) 1.76 KB
/*
Title: 34.Worker_Pools.go
Author: OpenSource
Date: 2017-05-21
Description: For Study
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, result chan <- int){
for j := range jobs{
fmt.Println("worker id: ", id, "|| started job: ", j)
time.Sleep(time.Second)
fmt.Println("worker id: ", id, "|| finished job: ",j)
result <- j * 2
}
}
func main(){
fmt.Println("34.Worker_Pools.go---------Start------------\n\n")
jobs := make(chan int, 100)
results := make(chan int, 100)
// In order to use our pool of workers we need to send them work and collect their results.
// We make 2 channels for this.
// 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++ {
fmt.Println("<-results", <-results)
}
fmt.Println("\n\n 34.Worker_Pools.go----------End-------------")
// Our running program shows the 5 jobs being executed by various workers.
// The program only takes about 2 seconds despite doing about 5 seconds of total work
// because there are 3 workers operating concurrently.
}
You can’t perform that action at this time.