# Go Cheatsheet - Worker pool pattern

We can use channels to easily simulate a worker pool:

```go
package main

import (
	"fmt"
	"time"
)

func main() {
	numWorkers := 5
	numJobs := 100

	// make sure these 2 channels have buffer size of numJobs
	jobChan := make(chan int, numJobs)
	completeChan := make(chan int, numJobs)

	fmt.Printf("Spawn %d workers\n", numWorkers)

	for i := 0; i < numWorkers; i++ {
		go worker(i, jobChan, completeChan)
	}

	fmt.Printf("Add %d jobs\n", numJobs)
	for i := 0; i < numJobs; i++ {
		jobChan <- i
	}
	close(jobChan)

	for i := 0; i < numJobs; i++ {
		id := <-completeChan
		fmt.Printf("Job %d is done\n", id)
	}
}

func worker(id int, jobChan <-chan int, completeChan chan<- int) {
	for job := range jobChan {
		fmt.Printf("Processing job %d\n", job)
		time.Sleep(time.Second)
		completeChan <- job
	}
}
```
