package main
import (
"fmt"
"time"
)
func main() {
numTasks := 5
resultsChan := make(chan int, numTasks)
defer close(resultsChan)
for i := 0; i < numTasks; i++ {
go func(taskID int) {
// 模拟网络请求延迟
time.Sleep(time.Duration(taskID+1) * time.Second)
result := taskID * 10
resultsChan <- result
}(i)
}
var allResults []int
for i := 0; i < numTasks; i++ {
allResults = append(allResults, <-resultsChan)
}
fmt.Println("汇总结果:", allResults)
}
匿名函数的作用
- 封装任务逻辑:每个匿名函数封装了一个独立的任务逻辑,这里是模拟网络请求延迟并生成结果,使得代码逻辑更加清晰,易于维护和管理。
- 并发执行:通过
go
关键字启动匿名函数作为协程,实现了多个任务的并发执行,提高了程序的执行效率。
避免死锁的方法
- 合理使用通道:
- 缓冲通道:创建
resultsChan
时使用了带缓冲的通道make(chan int, numTasks)
,这样在向通道发送数据时,不会立刻阻塞,直到缓冲区满。
- 及时关闭通道:在
main
函数开始处使用defer close(resultsChan)
,确保在main
函数结束前关闭通道,避免接收端因通道未关闭而一直阻塞。
- 确保接收和发送的平衡:在
main
函数中,通过for
循环接收numTasks
次数据,保证了接收数据的次数与发送数据的次数一致,避免因接收端接收次数不足导致发送端一直阻塞。