Golang channel【管道】和goroutine的理解及优缺点
一:不同 goroutine 之间如何通讯
- 全局变量加互斥锁同步【低水平】
package main import ( "fmt" "sync" "time" ) var ( myMap = make(map[int]int, 10) //声明一个全局的互斥锁 lock sync.Mutex //lock 是一个全局的互斥锁 sync 是一个同步的包 Mutex 是互斥 ) func test(n int) { res := 1 for i := 1; i <= n; i++ { res *= i } //我们将res放入到myMap中 //加锁 lock.Lock() myMap[n] = res // concurrent map writes //解锁 lock.Unlock() } func main() { //开启多个协程完成这个任务[200个] for i := 0; i <= 200; i++ { go test(i) } //休眠10秒钟 time.Sleep(time.Second * 10) //输出结果 lock.Lock() for i, v := range myMap { fmt.Printf("map[%d]=%d\n", i, v) } lock.Unlock() } - channel【高水平】
二:为什么使用channel
- 主线程在等待所有的goroutine全部完成的时间很难确定,随机设置时间仅仅是估算
- 如果主线程休眠时间太长了,会加长等待时间,如果等待时间短了,可能还有goroutine处于工作状态,这时也会随主线程的退出而销毁
- 通过全局变量加锁同步实现通讯,也并不利于多个协程对全局变量的读写操作
三:channel的基本介绍
- channel本质就是一个数据结构【队列-先进先出】
- 多个gorontine访问时,不需要加锁【channel本身就是线程安全的】
- channel 有类型的,一个string的channel只能存放string类型数据
本文来自博客园,作者:Carver大脸猫,转载请注明原文链接:https://www.cnblogs.com/carver/articles/18458172

浙公网安备 33010602011771号