Go语言协程通道使用问题
warning:
这篇文章距离上次修改已过183天,其中的内容可能已经有所变动。
package main
import (
"fmt"
"time"
)
func worker(id int, c chan int) {
for n := range c {
fmt.Printf("Worker %d received %d\n", id, n)
time.Sleep(time.Second)
}
}
func main() {
const numWorkers = 3
const numMessages = 5
workers := make([]chan int, numWorkers)
for i := range workers {
workers[i] = make(chan int)
go worker(i, workers[i])
}
for i := 0; i < numMessages; i++ {
time.Sleep(time.Second)
fmt.Printf("Master sending %d\n", i)
for _, worker := range workers {
worker <- i
}
}
for _, worker := range workers {
close(worker)
}
fmt.Scanln() // 阻塞主goroutine,防止程序立即退出
}
这段代码修复了原始代码中的问题,并提供了一个简单的Go程序示例,它创建了一个工作池,并向每个工作程序平均分配了任务。每个工作程序在自己的goroutine中运行,并且主goroutine会等待用户输入来防止程序立即退出。这个例子展示了Go语言中协程、通道和工作池模式的基本使用方法。
评论已关闭