go 协程实战总结

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
原创文章 138 获赞 12 访问量 7万+

猜你喜欢

转载自blog.csdn.net/m0_38004619/article/details/104874586
今日推荐