1. go 线程池
1.1. 基础款
func main() {
const (
numWorkers = 3 // worker 数量
numJobs = 10 // job 数量
)
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
// 创建 3 个工作函数。它们是同时运行的。
for i := 1; i <= numWorkers; i++ {
go work(i, jobs, results)
}
// 分派 10 个工作
for i := 1; i <= numJobs; i++ {
jobs <- i
}
close(jobs) // 关闭 channel。关闭后工作函数会退出。
// 把结果 channel 里面的数据全部取出
for i := 0; i < numJobs; i++ {
<-results
}
}
// 工作函数: 等待 job(用 chan 卡死)
func work(id int, jobs <-chan int, results chan<- int) {
for i := range jobs {
fmt.Printf("worker %d started job %d\n", id, i)
time.Sleep(time.Second)
fmt.Printf("worker %d finished job %d\n", id, i)
results <- 2 * i
}
fmt.Printf("worker %d exited\n", id)
}
结果:
worker 1 started job 2
worker 2 started job 3
worker 3 started job 1
worker 2 finished job 3
worker 1 finished job 2
worker 1 started job 5
worker 2 started job 4
worker 3 finished job 1
worker 3 started job 6
worker 1 finished job 5
worker 1 started job 7
worker 2 finished job 4
worker 2 started job 8
worker 3 finished job 6
worker 3 started job 9
worker 3 finished job 9
worker 3 started job 10
worker 1 finished job 7
worker 1 exited
worker 2 finished job 8
worker 2 exited
worker 3 finished job 10
worker 3 exited