-
goroutines : 独立执行每个任务,并 可能并行 执行
-
channels : 用于 goroutines 之间的通讯、同步
func main()
{
tasks := getTasks()
// 处理每个任务
for
_, task :=
range
tasks {
process(task)
}
}
|
func main()
{
// 创建带缓冲的 channel
ch :=
make
(
chan
Task,
3
)
// 运行固定数量的 workers
for
i :=
0
; i < numWorkers; i++ {
go
worker(ch)
}
// 发送任务到 workers
hellaTasks := getTasks()
for
_, task :=
range
hellaTasks {
ch <- task
}
...
}
func worker(ch chan Task)
{
for
{
// 接收任务
task := <-ch
process(task)
}
}
回顾前面提到的 channel 的特性,特别是前两个。如果忽略内置的 channel,让你设计一个具有 goroutines-safe 并且可以用来存储、传递值的东西,你会怎么做?很多人可能觉得或许可以用一个带锁的队列来做。没错,事实上,channel 内部就是一个带锁的队列。 https://golang.org/src/runtime/chan.go
对于每一个 因为 为了方便描述,我们用
|