纠纷奇闻作文社交美文家庭
聚热点
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

并发编程之协程调度context

9月9日 乱人心投稿
  在并发程序中,由于超时、取消操作或其他一些异常情况,往往需要通知其他goroutine,虽然可以使用channel来处理这些问题,但是会变得非常繁琐,而且不利于多级管理。
  go使用Context来做解决方案。1、Context接口typeContextinterface{Deadline()(deadlinetime。Time,okbool)Done()chanstruct{}Err()errorValue(keyinterface{})interface{}}
  Context接口包含4个方法Deadline:返回绑定当前Context的任务被取消的截止时间,如果没有设置时间,okfalseDone:context任务被取消,返回一个信号struct{},如果不被取消,返回nilErr:如果Done已经关闭,将返回非空的值表明任务结束的原因Value:存储的键值对中当前key对应的值2、emptyCtx
  emptyCtx其实就是一个int类型的变量,实现了Context接口。
  如其名,就是一个没有设置超时时间,不能取消,也不能存储键值对的Context。
  emptyCtx用来作为context的根结点。typeemptyCtxintfunc(emptyCtx)Deadline()(deadlinetime。Time,okbool){return}func(emptyCtx)Done()chanstruct{}{returnnil}func(emptyCtx)Err()error{returnnil}func(emptyCtx)Value(keyinterface{})interface{}{returnnil}
  而我们通常不会直接使用emptyCtx,而是使用emptyCtx实例化的两个变量var(backgroundnew(emptyCtx)todonew(emptyCtx))funcBackground()Context{returnbackground}funcTODO()Context{returntodo}Background:通常被用作主函数,初始化以及测试中,作为顶级的contextTODO:不确定使用什么context时3、valueCtx3。1、基础类型typevalueCtxstruct{Contextkey,valinterface{}}func(cvalueCtx)Value(keyinterface{})interface{}{ifc。keykey{returnc。val}returnc。Context。Value(key)}
  valueCtx利用了context类型的变量来表示父节点context,继承了父context的所有信息。
  valueCtx携带了一个键值对,实现了Value方法,所以可以在context上获取key对应的值,如果context不存在,会沿着父context向上查找3。2、实现方法funcWithValue(parentContext,key,valinterface{})Context{ifkeynil{panic(nilkey)}if!reflectlite。TypeOf(key)。Comparable(){panic(keyisnotcomparable)}returnvalueCtx{parent,key,val}}
  向context中添加键值对,并不是直接在原context上直接添加,而是创建一个新的valueCtx,将键值对添加在子节点上。4、cancelCtx4。1、基础类型typecancelerinterface{cancel(removeFromParentbool,errerror)Done()chanstruct{}}typecancelCtxstruct{Contextmusync。Mutexdonechanstruct{}childrenmap〔canceler〕struct{}errerror}
  和valueCtx类似,也有父context,通道done用来传递关闭信号。children存储了context节点下的子节点,err用于存储取消原因func(ccancelCtx)Value(keyinterface{})interface{}{ifkeycancelCtxKey{returnc}returnc。Context。Value(key)}func(ccancelCtx)Done()chanstruct{}{c。mu。Lock()ifc。donenil{c。donemake(chanstruct{})}d:c。donec。mu。Unlock()returnd}func(ccancelCtx)Err()error{c。mu。Lock()err:c。errc。mu。Unlock()returnerr}4。2、实现方法funcWithCancel(parentContext)(ctxContext,cancelCancelFunc){c:newCancelCtx(parent)propagateCancel(parent,c)returnc,func(){c。cancel(true,Canceled)}}
  newCancelCtx只是初始化了cancelCtxfuncnewCancelCtx(parentContext)cancelCtx{returncancelCtx{Context:parent}}
  propagateCancel建立当前节点与父节点的取消逻辑funcpropagateCancel(parentContext,childcanceler){done:parent。Done()ifdonenil{return}select{casedone:child。cancel(false,parent。Err())returndefault:}ifp,ok:parentCancelCtx(parent);ok{p。mu。Lock()ifp。err!nil{child。cancel(false,p。err)}else{ifp。childrennil{p。childrenmake(map〔canceler〕struct{})}p。children〔child〕struct{}{}}p。mu。Unlock()}else{atomic。AddInt32(goroutines,1)gofunc(){select{caseparent。Done():child。cancel(false,parent。Err())casechild。Done():}}()}}
  1、如果父context已经取消了,就直接返回,因为父节点不可能再被取消了
  2、监听信号done,如果接收到了就通知子context取消
  3、如果找到父context,就挂在父context上
  4、如果没有找到父context,也就是自身是根context,就启动一个goroutine监听信号
  而调用的cancel方法,其实就是关闭通道及设置原因func(ccancelCtx)cancel(removeFromParentbool,errerror){iferrnil{panic(context:internalerror:missingcancelerror)}c。mu。Lock()ifc。err!nil{c。mu。Unlock()returnalreadycanceled}c。errerrifc。donenil{c。doneclosedchan}else{close(c。done)}forchild:rangec。children{child。cancel(false,err)}c。childrennilc。mu。Unlock()ifremoveFromParent{removeChild(c。Context,c)}}5、timerCtx5。1、基础类型typetimerCtxstruct{cancelCtxtimertime。Timerdeadlinetime。Time}func(ctimerCtx)Deadline()(deadlinetime。Time,okbool){returnc。deadline,true}
  timer声明了一个定时器,用于发送截止时间5。2、实现方法funcWithDeadline(parentContext,dtime。Time)(Context,CancelFunc){ifcur,ok:parent。Deadline();okcur。Before(d){returnWithCancel(parent)}c:timerCtx{cancelCtx:newCancelCtx(parent),deadline:d,}propagateCancel(parent,c)dur:time。Until(d)ifdur0{c。cancel(true,DeadlineExceeded)returnc,func(){c。cancel(false,Canceled)}}c。mu。Lock()deferc。mu。Unlock()ifc。errnil{c。timertime。AfterFunc(dur,func(){c。cancel(true,DeadlineExceeded)})}returnc,func(){c。cancel(true,Canceled)}}
  大致和cancelCtx差不多,多了声明的定时器,用于发送截止时间。
  而timerCtx。cancel有些不一样,是关闭定时器的。func(ctimerCtx)cancel(removeFromParentbool,errerror){c。cancelCtx。cancel(false,err)ifremoveFromParent{removeChild(c。cancelCtx。Context,c)}c。mu。Lock()ifc。timer!nil{c。timer。Stop()c。timernil}c。mu。Unlock()}
  关于timerCtx还有一个方法funcWithTimeout(parentContext,timeouttime。Duration)(Context,CancelFunc){returnWithDeadline(parent,time。Now()。Add(timeout))}
  与WithDeadline类似,只不过是创建了一个过期时间的context6、总结context主要用于父子之间同步信号,本质上是一种协程调度方式context是线程安全的,因为context本身不变父context通知子context取消,但是不会干涉子任务的执行,也就是说context的取消机制是无侵入的子context的取消是不会影响父context的
投诉 评论 转载

Meta将于4月28日发布2022年第一季度财报三言财经4月6日消息,Facebook母公司MetaPlatforms(Nasdaq:FB)宣布,将于美国东部时间4月27日股市收盘后(北京时间4月28日)公布2022年第一季……探秘藏在太行山里的超级工程水库竟建在山顶上,太壮观7月23日,河北省石家庄市井陉县西南方向40公里处的张河湾水库,一片绿意盎然。在阳光的折射下,湖水就像碧绿的宝石,与连绵起伏的太行山勾勒出一幅美丽的山水画卷。无人机缓缓升起,俯……一手掌握的优雅,魅族18小屏旗舰手机上手实测CiaoBella,我是老房。老房一直认为为情怀买单是一件很愚蠢的事情,品质不过硬却非得绑架感情,糟糕至极。(参见《魔兽争霸3重置版》)。在魅族18刚公布的时候也有人这么……微信7个不为人知的冷技巧,每个都实用强大,可惜你还不知道微信作为日常使用比较频繁的工具,除了聊天之外,还有很多非常实用的功能。这里就来分享微信7个不为人知的冷技巧,每个都很实用强大,可惜不是很多人都知道,可以看看你知道几个哦。……并发编程之协程调度context在并发程序中,由于超时、取消操作或其他一些异常情况,往往需要通知其他goroutine,虽然可以使用channel来处理这些问题,但是会变得非常繁琐,而且不利于多级管理。……多款知名陪玩软件被无限期下架游戏行业的火热让很多行业跟着走红,其中直播行业慢慢向有限的几个平台靠拢,虎牙和斗鱼的合并因为相关部门的干预告吹!直播的流行让陪玩业兴起,但是陪玩平台在经历了野蛮发展之后,慢慢衍……现代的这场赌,注定不会输,盘点第五代途胜L的三大亮点在先秦孙武《孙子九地》中有这么一句话:投之亡地然后存,陷之死地然后生。可能很多人没有读过,但相信大家也能够理解这句话的意思!当然如果这句话的意思理解不了,有一个成语那么大家就会……220Whkg能量密度800km续航!合创汽车全新打造历经3个月的测试,合创汽车在黑龙江省黑河市的极寒标定试验顺利结束。在40的极寒环境底下,合创汽车的研发团队针对超长续航版本的Z03反复进行了低温动力性试验、低温续航试验、冰雪路……贝索斯和亚马逊的经营哲学与底层逻辑究竟是什么如果说《巴菲特致股东的信》引导我们学习价值投资,那么这本《贝佐斯致股东的信》则带领我们提升商业管理能力。本书更像是作者总结的亚马逊成功的14条增长法则,不仅适用于创业者,……新规出台后,社区团购生鲜电商平台将如何发展?国家支持平台创新发展,主要方向是增强国际竞争力。换句话说,国家支持你们去海外做大做强,而不是一门心思只想着在国内割自家人的韭菜。社区团购,本质上就是干掉现在卖菜的小……我家电脑是i9配置的,现在配置低了不够用,想升级高一点配置的我觉得题主可能是一个电脑小白,当然了,我也是一个电脑小白,只不过题主可能比我还要小白。题主只是说了一个cpu是i9的配置,其实很难说电脑应该再如何升级了。因为电脑的运行需……用户总是一次性消费,商家如何圈人圈心实现高效留存?相信很多实体店都遇到过类似的情况,那就是客户来了一次就不来了,客户留存难,那么面对这种情况该如何解决呢?一、用户难留存的原因1、品牌硬件条件差2、产品的可替代……
你说过最违心的话是什么?六一将至,方广食品惊喜集盒带回家比AirPods还小的充电宝,自带充电线,苹果安卓都能充空袭蔚来?被华尔街秃鹰盯上殃及张亚勤阿里曾5亿元和解未来的世界会是机械智能化嘛?汤姆猫申万宏源证券信达澳银基金等2家机构于1月18日调研我司浅析智能应用落地现状好用不止在聚会,奶爸的又一件烹饪神器,小米米家双口电磁炉分享为什么手机里面的文件夹都是以英文命名的?到底哪些我们可以删君子兰颜色越养越深的原因和解决方法当我们讨论选择传统车企or新势力的产品时,我们究竟在选择什么java为什么使用线程池
天空的孩子作文用护色剂违法吗记者巴黎为什克提供800万欧年薪,国米只提供600万650万模型背景下,AI芯片厂商面临怎样的机遇与挑战?深度研报热博聚 linux常用命令有哪些?linux命令大全十位开国大将中,毛主席只到他家中做过客让你夫人亲自给我炒菜石达开为什么负气出走?真的带走了几十万精兵?跌倒造句用跌倒造句大全2021国庆节返程高峰期是几号夏季日常保健推荐豆腐丸子枸杞叶汤年度国内外十大宕机事件你知道几件大学生怎么赚钱(适合大学生的25个副业)

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形