package main
import (
"fmt"
)
func squareTask(num int, resultChan chan int) {
result := num * num
resultChan <- result
}
func main() {
tasks := []int{1, 2, 3, 4, 5}
resultChan := make(chan int, len(tasks))
for _, task := range tasks {
go squareTask(task, resultChan)
}
var results []int
for i := 0; i < len(tasks); i++ {
results = append(results, <-resultChan)
}
close(resultChan)
fmt.Println("Results:", results)
}
通道实现并发控制分析
- 任务执行:每个任务通过
go squareTask(task, resultChan)
开启一个 goroutine
并发执行。squareTask
函数计算整数的平方,并将结果发送到 resultChan
通道。
- 数据收集:主
goroutine
通过 for
循环从 resultChan
通道读取结果,并将其追加到 results
切片中。由于 for
循环的读取顺序,这里并不能保证任务的有序执行。如果要保证有序执行,可以使用带缓冲通道并按任务发送顺序读取,或者使用另一个通道来跟踪任务完成顺序。
- 避免数据竞争:这里通过通道进行数据传递,
goroutine
之间不直接共享内存,而是通过通道发送和接收数据。通道本身是线程安全的,因此避免了数据竞争问题。同时,在所有数据读取完毕后,通过 close(resultChan)
关闭通道,防止向已关闭通道发送数据引发运行时错误。