示例
以下代码演示了如何使用 Goroutines 并发计算一组数字的平方,并通过通道收集结果。
package mainimport ("fmt""time"
)// worker 函数,用于计算一个数字的平方,并将结果发送到通道
func worker(id int, numbers <-chan int, results chan<- int) {for number := range numbers {fmt.Printf("Worker %d is processing number %d\n", id, number)time.Sleep(time.Second) // 模拟一些耗时操作results <- number * number}
}func main() {// 创建两个通道:一个用于传递任务,另一个用于接收结果numbers := make(chan int, 10)results := make(chan int, 10)// 启动 3 个 worker goroutinesfor i := 1; i <= 3; i++ {go worker(i, numbers, results)}// 向 numbers 通道发送任务for i := 1; i <= 10; i++ {numbers <- i}close(numbers) // 关闭 numbers 通道,表示不再发送任务// 从 results 通道接收结果for i := 1; i <= 10; i++ {result := <-resultsfmt.Printf("Result: %d\n", result)}
}
代码说明
- worker 函数:
- 每个 worker 从 numbers 通道中取出一个数字,计算其平方,并将结果发送到 results 通道。
- 使用 range 从通道中读取数据,直到通道关闭。
- 主函数:
- 创建了两个通道:numbers 用于存放待处理的任务,results 用于存放计算结果。
- 启动了 3 个 Goroutines,每个 Goroutine 都运行 worker 函数。
- 将 1 到 10 的数字发送到 numbers 通道,随后关闭通道。
- 最后,从 results 通道中读取并打印所有计算结果。
3、 并发执行: - 由于同时启动了 3 个 Goroutines,多个任务会被并发处理,从而提高处理效率。
输出示例
运行程序后,你会看到类似以下的输出:
Worker 1 is processing number 1
Worker 2 is processing number 2
Worker 3 is processing number 3
Worker 1 is processing number 4
Worker 2 is processing number 5
Worker 3 is processing number 6
Result: 1
Result: 4
Result: 9
Result: 16
Result: 25
Result: 36
...
每次运行程序时,任务的分配可能会有所不同,因为 Goroutines 的调度是非确定性的。