1、使用 go 函数启动协程
2、主线程退出时,所有没有执行完的协程也会终止(引发问题)
3、多个协程不能同时操作一块内存,会报错 (引发问题)
4、使用锁机制控制多个协程操作同一块内存,在写内存时开启锁,写完时关闭锁(解决3问题 不推荐使用)
5、使用管道控制多个协程操作同一块内存,管道就是一个队列,先进先出。(解决3问题 推荐使用)
1.管道申请
var intChan chan int 可读可写
var intChan <-chan int 只读
var intChan chan <- int 只写
2.管道需要 make初始化操作,存满之后不能再存放
intChan = make(chan int, 3)
3.在没有使用协程的情况下,如果 channel 数据取完了,再取,就会报 dead lock
4.管道遍历
在遍历时,如果 channel 没有关闭,则会出现 deadlock 的错误。
在遍历时,如果 channel 已经关闭,则会正常遍历数据,遍历完后,就会退出遍历。
5.使用 select 可以解决管道channel不关闭的问题,无需关心什么时候管道需要关闭
for {
select {
case v := <-intChan :
fmt.Printf("从 intChan 读取的数据%d\n", v)
default :
fmt.Printf("都取不到了,可以加入逻辑\n")
return
}
}
6、解决主线程等待子线程都运行完再退出
var wg sync.WaitGroup
wg.Add(n) // 协程数量
wg.Done() // 操作完成,减少一个计数
wg.Wait() // 等待,直到计数为0
go 协程实战总结
猜你喜欢
转载自blog.csdn.net/m0_38004619/article/details/104874586
今日推荐
周排行