Go Concurrency
Go Worker Pool
Share a queue of jobs between a fixed number of goroutines to limit how much runs at once.
What you'll learn
- A jobs channel
- Several workers
- Closing results safely
6 jobs, 3 workers
- 1
jobs1 2 3 4 5 6 - 2
3 workersn * n - 3
results1 4 9 16 25 36
A fixed team of workers
A worker pool starts a fixed number of goroutines that all read jobs from one channel. It limits how much work runs at the same time, which protects memory, files and network connections.
Three workers read from jobs until it is closed and send each answer to results. A separate goroutine closes results after every worker has finished, which ends the final range loop. Each result carries its job number, so the order in which workers finish does not matter.
Key points
- All workers read from one jobs channel.
close(jobs)tells them to stop.- Results are closed after every worker is done.
Runnable Go example
main.go
package main
import (
"fmt"
"sync"
)
func worker(jobs <-chan int, results chan<- [2]int, wg *sync.WaitGroup) {
defer wg.Done()
for n := range jobs {
results <- [2]int{n, n * n}
}
}
func main() {
jobs := make(chan int)
results := make(chan [2]int)
var wg sync.WaitGroup
for w := 0; w < 3; w++ {
wg.Add(1)
go worker(jobs, results, &wg)
}
go func() {
for n := 1; n <= 6; n++ {
jobs <- n
}
close(jobs)
}()
go func() {
wg.Wait()
close(results)
}()
squares := make([]int, 7)
for result := range results {
squares[result[0]] = result[1]
}
fmt.Println(squares[1:])
}
[1 4 9 16 25 36]Practice
Open the example in the online compiler, change a value or add a line, and predict the output before you run it. Then break the code on purpose and read the compiler's message.
Finished this lesson?
Mark it as learned to track your progress.
Your progress is saved in this browser Sign in to keep it on every device.
Practice with a challenge
Use what this lesson covers to solve a real problem. Each challenge runs in your browser with instant tests and an AI review.
All challenges