go并发之美
文章平均质量分 80
(全部都是干货)各种干货方法总结(goroutine,通道,锁,select、协程调度、go并发结合redis、各种并发原语等等一应俱全)
优惠券已抵扣
余额抵扣
还需支付
¥9.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
ProblemTerminator
上行若水,大行至简
展开
-
go并发之道·sync.Once机制详细分析及避险之道
sync.Once的妙用/误区、及机制分析汇总原创 2022-09-16 08:15:00 · 357 阅读 · 0 评论 -
go并发之美·多个channel合并/多个数据流合并
go并发之美·多个channel合并/多个数据流合并原创 2023-03-07 19:06:48 · 799 阅读 · 0 评论 -
关于ticker.Stop定时任务及停止一段业务的避险之道
关于ticker.Stop定时任务及停止业务逻辑的避险之道原创 2022-09-22 21:05:42 · 446 阅读 · 0 评论 -
go并发之道·关闭channel的各种高效姿势汇总
关闭channel的各种高效姿势汇总原创 2022-09-23 22:45:00 · 457 阅读 · 0 评论 -
go并发之道·关闭channel的n种方式与关闭时机汇总
关闭channel的n种方式与关闭时机汇总原创 2021-05-06 18:07:57 · 3173 阅读 · 5 评论 -
关于go协程超时退出控制条件与方式分析
go协程超时退出控制条件与方式分析,一招搞定!原创 2022-06-23 15:27:30 · 1478 阅读 · 4 评论 -
go并发之美·redis篇·接口幂等性设计实现
随风随浪飘荡随着一生里的浪你我在重叠的那一刻顷刻各在一方...简单说下幂等性背景:1,支付页面有个支付按钮,用户本次订单是10元,点了支付后发现没反应,连续又点了3次有了反应(有反应不是因为需要点多次),最后网络等因素干扰解除后支付完毕时发现支付了40元。2,领奖页面,某某通过postman等工具频繁发起请求领奖尝试一次领多个奖励,如一次连续发送1000个请求给某个账号领取,实际上每个人只允许领一次。在基于鉴权通过的情况下,我们要做的就是不论是什么手段发来的请求,只操作第一个有效原创 2020-10-06 20:57:49 · 2235 阅读 · 0 评论 -
go并发之美·redis篇·实现实时排行榜
国庆假期第五天快结束了。今天你够浪了么?个人原创,欢迎阅读~初始化其clientimport ( "context" "github.com/go-redis/redis")var Rdb *redis.Clientfunc InitClient() (err error) { Rdb = redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", DB:原创 2020-10-05 21:29:01 · 2255 阅读 · 0 评论 -
基于3个goroutine交替顺序打印自然数
基于3个goroutine交替顺序打印自然数原创 2020-09-12 10:10:02 · 2072 阅读 · 1 评论 -
go并发日记·多goroutine并发安全的操作共享变量
千里之行,始于足下。// 多个协程并发安全的操作共享变量:允许多个goroutine操作变量,但是在同一个时刻最多只有一个goroutine在操作共享变量。// 背景设计:三个人共同抢票,抢完一次(只要还能抢到)还可继续抢,直到没票。var tickets = 15 // 剩余15张票var lock sync.Mutexvar wait sync.WaitGroupvar co...原创 2020-04-24 11:15:46 · 3336 阅读 · 1 评论 -
go并发日记·常用并发场景中的并发控制思路与方案
以下涉及讨论的情景均建立在代码中进行了并发的基础上。控制阻塞问题来了:为什么要阻塞?这个问题比较基础,因为代码中你虽然使用go关键字创建了goroutine,但实际上绝大对数情况下执行最快的还是main线(主线程),这时候其他地方你写的再多也是场景1:使用了goroutine来进行并发,希望持续进行不退出思路:使用select{}阻塞、for循环阻塞场景2:使用了goroutine来进行并发,希望执行完任务后退出思路:1,使用select{}阻塞(监听ch,逻辑执行完后给ch写入数原创 2020-09-26 21:42:33 · 1071 阅读 · 0 评论 -
go并发之美·多个操作的分发及限流
缘分随风飘荡缘尽此生也守望你我在凝望那一刻心中有泪飘降...code is graceful , thoughts are precious.今天又萌生一个想法,动手来实现下看看!模拟进行多个操作的分发及限流:模拟许多人在火车站窗口办理相关事情的情景。我们假设窗口分为三类A\B\C:买票窗口、改签/退票窗口、老弱病残孕爱心窗口,每种有多个窗口受大厅大小限制,A、B每个窗口排队最多5人,C类窗口最多排队3人,总有很多人在排队,可以想象下A类下面共3个窗口,即排队最多15人B类原创 2020-10-02 22:42:31 · 638 阅读 · 0 评论 -
动态创建goroutine和channel
动态的创建需求一般应用于动态的数据量、动态的时间等,比如我这里遇到的可能是数十万、百万左右的数据量推送请求。可以采取的方式比如按数据量来判断,以十万数据量为一个小单位,十万数据量对应一个channel、一个读goroutine以及一个写goroutine,因为每次推送的目标数量不定但都是比较大的,因此采取动态创建的方式达到较优的并发执行目的,整体goroutine的数量也是可控的。其它能想到的业务应用背景如:每天的数据在第二天凌晨进行加载同步,数据量都很大,那么可以根据数据量来决定goroutine和c原创 2020-12-20 17:56:55 · 530 阅读 · 0 评论 -
go多函数并发通用工具的设计与实现
看源码时出现此情此景,如出至宝,由此记录!目录可应用场景代码设计使用可应用场景多个函数并发执行各自功能的使用,每一个函数就是开启协程执行的一个单元,每个函数中即可进行如复杂网络请求等可支持并发的需求。例如你的项目中某接口中需要执行三个函数,这三个函数都是向指定库执行插入操作且顺序无关,函数返回error,这三个函数即可并发进行,就可用这个设计。代码设计自定义错误接口...原创 2019-11-28 18:03:37 · 722 阅读 · 2 评论 -
go并发之美·B操作伴随A操作(B和A同步)
时维九月,序属三秋。潦水尽而寒潭清,烟光凝而暮山紫。地势极而南溟深,天柱高而北辰远。人的思想是无限的,想法是很多的,我们每天都能碰到很多事情,也能想到很多事情。平时习惯于在桌面创建临时文件,接下来又会常常修改,大多数最后下来就成了必备的、常查看的文件,而桌面上的东西又经常会删除,备用性文件留在桌面上不太安全。今天想到了这个情景,结合在本地登录WPS时,本地修改后能同步到云端,备份新文件,这才有了这篇博文,于此,想写点代码趁机实现下我的想法。有了想法就准备行动,当自己能驾驭代码完成一件事、实现自己的想法原创 2020-10-02 13:46:20 · 543 阅读 · 0 评论 -
go并发日记·避免goroutine泄漏/实现协程可控
千里之行,始于足下。目录goroutine内部逻辑来触发控制结束goroutine方式1方式2方式3外部条件触发控制结束goroutine多个协程,某个goroutine逻辑内部报错需要停止时,需要所有goroutine都结束多个协程,其中某协程需要停止时不影响其他协程goroutine内部逻辑来触发控制结束goroutine实际背景:逻辑报错了需要停止任务...原创 2020-04-16 19:48:26 · 1534 阅读 · 2 评论 -
go并发日记·深入理解go语言channel与goroutine阻塞
会当凌绝顶,一览众山小。本文是自己对相关知识运用和理解的一些领悟,希望给大家带来帮助!go中的通道就是channel,用于goroutine之间的通讯/数据的传递。可以想象成一个管,一端有人操作发送,一端有人操作接收,如果发送端没有准备好不能发送,即使接收端能正常接收那也不能拿到数据,发送端能正常发送但是接收端不能正常接收,那么整个流程也是不流通的。只有两端都能保证正常发送和接收,数据才能...原创 2019-07-27 17:19:02 · 4094 阅读 · 0 评论 -
go并发日记·基于channel优雅的进行并发控制
人生如梦,一樽还酹江月。关于go通道和goroutine的理解请移步https://blog.csdn.net/HYZX_9987/article/details/97528721项目中有这样一段代码,大概结构如下:for{ for{ data = xxx() //处理data的逻辑,res.xx += data.xx }}/...原创 2019-09-23 13:13:01 · 2171 阅读 · 0 评论 -
go并发日记·WaitGroup并发控制探索及实际场景运用
人生如梦,一樽还酹江月。目录简化案例实际案例欣赏etcd源码中的WaitGroup使用片段简化案例看这段代码,(我们要的理想结果是输出的和为5):func main() { wg := sync.WaitGroup{} sum:=0 for i := 0; i < 5; i++ { go func(wg sync.WaitGroup, i int) {...原创 2019-09-16 17:27:35 · 2067 阅读 · 3 评论 -
channel死锁的情况分析
大本营:https://blog.csdn.net/HYZX_9987什么是死锁?信手拈来的一段话,我觉得讲的很到位:所有的线程或进程都在等待资源的释放。如下的程序中, 只有一个goroutine, 所以当你向里面加数据或者存数据的话,都会锁死信道, 并且阻塞当前 goroutine, 也就是所有的goroutine(其实就main线一个)都在等待信道的开放(没人拿走数据信道是不会开放的)...原创 2019-07-29 17:59:52 · 847 阅读 · 0 评论