qy8千亿国际手机版-qy8千亿国际app版网站建设第一品牌
网络营销整合专家

go ctx超时导致资源释放失败

来源:   2019-10-03 16:22

 
// 入参的qy8千亿国际手机版ctx本身已经带了超时
func DoSomehting error {
 // 使用redis作为分布式锁
 isDuplidated, err := redis.SetDeDupliated
 if err != nil {
 return err
 if isDupdated {
 return nil
 // 释放锁. 使用了ctx, 有问题.
 defer redis.DeleteDeDuplicated
 // 业务操作
 err = doSomethingFoo
 if err != nil {
 return err
 err = doSomethingBar
 if err != nil {
 return err
 return nil

入参的ctx带有cancel机制。
问题在于defer那一行代码,释放资源使用了 DoSomething 的ctx。如果业务操作代码cancel了ctx,或者是执行了耗时操作,而正好 redis.DeleteDeDuplicated 也使用了ctx的cancel机制,那么这个redis锁就无法释放了。


如果ctx中带有通用的上下文信息,需要写个函数生成一个新的ctx,同时把原来ctx的kv复制出来。否则直接使用context.Background就好了。

func CopyCtx context.Context {
 ret := context.Background 
 ret = context.WithValue
 ret = context.WithValue 
 return ret
 defer redis.DeleteDeDuplicated, args)
 // defer redis.DeleteDeDuplicated, args)

阅读context代码可以发现,ctx的cancel/timeout机制,对当前ctx以及其子ctx有效,不影响父ctx。

ps: context的父子关系如下

 father := context.Background
 son := context.WithValue
点击进入“下一篇”继续浏览
返回列表

最新案例

最新案例

最新资讯最新资讯

品牌创意网站建设 上市公司网站建设 大型门户类网站建设 全方位网站运营代理
企业官方网站建设 B2C电子商务网站建设 专题活动网站(MINISITE)

更多 +联系我们

业务电话:0755/837391590755/33121570

业务 QQ:   传真: 0755-83739169

E-mail:   售后QQ :764390686

我们的认知

当对手还在将注意力停留在碎片化的互联网设计或程序实现时,织梦帮早已开始将数字品牌的建设和传播进一步整合。只有通过整体的互联网品牌分析,帮助品牌建立互联网品牌传播价值,并围绕价值建立品牌粘性,提升品牌与用户的互动,更好的帮助品牌传播,触发用户的行动力才是我们工作的终极目标,这正是一流品牌的成功秘诀。
不可否认,建立互联网品牌传播价值的确是门艺术,但互联网不同于艺术涂鸦,企业投资品牌绝不是希望品牌成为某个艺术家的实验品。互联网传播的对象是用户,用户拥有自己的文化体系,群落共性才是互联网品牌传播创意的源头,如果我们不能帮助企业激发目标用户的共鸣,产生购买冲动,那将是品牌的悲剧! 因此,互联网传播必须建立品牌传播价值,为梦想者创造梦想品牌,织梦帮与您同行!

合作意向表

您需要的服务

现有网站改版
我需要做微信营销
建设全新的企业网站
要找长期合作公司,需要年度服务

您最关注的地方

对功能要求比较高
对设计创意要求比较高
需要可以购物支付
搜索引擎排名

预算

3-5万 5-8万 8-10万 10万以上需招投标
验证码