分享
go并发编程
氓浅 · · 1838 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
- Concurrentcy is not parallelism: Different concurrent designs enable different ways to parallelize
tip:与defer一样,go程也会因"延迟执行"而立即复制参数
关键方法:runtime.GOMAXPROCS();runtime.NumCPU;runtime.Gosched();runtime.Goexit()【会保证所有延迟调用执行】;在main.main中调用Goexit,会在等待其他任务结束后,直接崩溃;
- 进程退出时不会等待go程结束
方案1:通道channel阻塞,然后发送退出信号,主线程 <-ch,go程中执行 close(sh),(此例只针对单个任务)
方案2:使用sync.WaitGroup方法,使用时计数器在go程外添加
- 通道
采用经典的CSP模型,有缓冲的为异步通道,无缓冲的为同步通道,通道本质为消息队列
收发:可使用ok-idom或range模式处理数据,x, ok := <-ch ok判断通道是否关闭;
及时使用close函数关闭通道引发结束通知,否则可能导致死锁
一次性时间用close效率更好,没有多余开销,连续或多样性时间,可传递不同数据标志实现。还可以使用sync.Cond实现单播或广播事件。
.向已关闭的通道发送数据,引发panic
.从已关闭通道接收数据,返回已缓冲数据或零值
.无论收发,nil通道都会阻塞
重复关闭,或关闭nil通道都会引发panic错误
单向通道:使用类型转换来获取单向通道,并分别赋予操作双方
.不能在单向通道上做逆向操作
.clole不能用于接收端
.不能将单向通道重新转换回去
c := make(chan int)
var send chan<- int = c
var recv <-chan int = c
select:同时处理多个通道使用,如果要等全部通道消息处理结束(closed),可将已完成通道设置成nil,这些通道就会被阻塞,不在被select选中。
.即便是同一通道,也会随机选择case执行
- 同步
tip:通道并非用来取代锁的,通道倾向于解决逻辑层次的并发处理架构,
而锁是用来保护局部范围内的数据安全
将Mutex作为匿名字段时,相关方法必须实现为pointer-receiver,
否则会因复制导致锁机制失效;也可以嵌套*Mutex来避免复制,但需要专门的初始化
Mutex不支持递归锁,即便在同一goroutine下也会导致死锁
.对性能要求较高时,应避免使用defer Unlock
.读写并发时,用RWMutex性能会更好一些
.对单个数据读写保护,可尝试使用原子操作
.执行严格测试,尽可能打开数据竞争检查
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信1838 次点击
上一篇:一致性哈希算法与高可用集群代理
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
- Concurrentcy is not parallelism: Different concurrent designs enable different ways to parallelize
tip:与defer一样,go程也会因"延迟执行"而立即复制参数
关键方法:runtime.GOMAXPROCS();runtime.NumCPU;runtime.Gosched();runtime.Goexit()【会保证所有延迟调用执行】;在main.main中调用Goexit,会在等待其他任务结束后,直接崩溃;
- 进程退出时不会等待go程结束
方案1:通道channel阻塞,然后发送退出信号,主线程 <-ch,go程中执行 close(sh),(此例只针对单个任务)
方案2:使用sync.WaitGroup方法,使用时计数器在go程外添加
- 通道
采用经典的CSP模型,有缓冲的为异步通道,无缓冲的为同步通道,通道本质为消息队列
收发:可使用ok-idom或range模式处理数据,x, ok := <-ch ok判断通道是否关闭;
及时使用close函数关闭通道引发结束通知,否则可能导致死锁
一次性时间用close效率更好,没有多余开销,连续或多样性时间,可传递不同数据标志实现。还可以使用sync.Cond实现单播或广播事件。
.向已关闭的通道发送数据,引发panic
.从已关闭通道接收数据,返回已缓冲数据或零值
.无论收发,nil通道都会阻塞
重复关闭,或关闭nil通道都会引发panic错误
单向通道:使用类型转换来获取单向通道,并分别赋予操作双方
.不能在单向通道上做逆向操作
.clole不能用于接收端
.不能将单向通道重新转换回去
c := make(chan int)
var send chan<- int = c
var recv <-chan int = c
select:同时处理多个通道使用,如果要等全部通道消息处理结束(closed),可将已完成通道设置成nil,这些通道就会被阻塞,不在被select选中。
.即便是同一通道,也会随机选择case执行
- 同步
tip:通道并非用来取代锁的,通道倾向于解决逻辑层次的并发处理架构,
而锁是用来保护局部范围内的数据安全
将Mutex作为匿名字段时,相关方法必须实现为pointer-receiver,
否则会因复制导致锁机制失效;也可以嵌套*Mutex来避免复制,但需要专门的初始化
Mutex不支持递归锁,即便在同一goroutine下也会导致死锁
.对性能要求较高时,应避免使用defer Unlock
.读写并发时,用RWMutex性能会更好一些
.对单个数据读写保护,可尝试使用原子操作
.执行严格测试,尽可能打开数据竞争检查