当前位置: 首页 > wzjs >正文

上海微信网站建设怎么去做推广

上海微信网站建设,怎么去做推广,建个企业网站多少钱,深圳建站网站模板文章目录 如何确保异步任务在 HTTP 返回后继续执行?问题分析如何确保异步任务在 HTTP 返回后继续执行?(1)使用独立的 context(2)手动传递父 ctx 中的值(3)使用 context.WithoutCance…

文章目录

  • 如何确保异步任务在 HTTP 返回后继续执行?
    • 问题
    • 分析
    • 如何确保异步任务在 HTTP 返回后继续执行?
      • (1)使用独立的 context
      • (2)手动传递父 ctx 中的值
      • (3)使用 context.WithoutCancel(Go 1.21+)
    • context.WithoutCancel
      • context.WithoutCancel 的优势
      • context.WithoutCancel 的注意事项

如何确保异步任务在 HTTP 返回后继续执行?

问题

在 Gin 框架中,如果直接在主请求处理函数中启动一个协程(go),当 HTTP 请求返回时,父 context.Context 可能会被取消,这会导致协程中的任务无法正常执行或提前终止。这是因为 Gin 的 context.Context 与 HTTP 请求的生命周期绑定,请求结束后,context 会被自动取消。

分析

在 Gin 中,c.Request.Context() 是与当前 HTTP 请求绑定的 context.Context。
当 HTTP 请求处理完成并返回响应时,Gin 会自动取消这个 context。

父 ctx 被取消的影响:
如果你在协程中使用父 ctx,而父 ctx 被取消,协程中的任务可能会收到取消信号,导致任务提前终止。
例如,如果你在协程中调用了 ctx.Done(),它可能会立即返回,导致任务无法完成。

如果你的协程没有监听 ctx.Done(),父 ctx 被取消不会直接导致协程任务终止。
但是,父 ctx 中存储的值(如 traceID、requestID 等)可能无法正常访问,因为父 ctx 被取消后,其内部状态可能被清理。

如何确保异步任务在 HTTP 返回后继续执行?

(1)使用独立的 context

在启动协程时,创建一个新的、独立的 context.Context,而不是直接使用 Gin 的 c.Request.Context()。
示例:

func handler(c *gin.Context) {// 创建一个新的、独立的 contextasyncCtx := context.Background()// 启动协程,并传递新的 contextgo asyncTask(asyncCtx)
}func asyncTask(ctx context.Context) {// 执行任务log.Info("Async task started")time.Sleep(5 * time.Second)log.Info("Async task completed")
}

缺点:
无法继承父 ctx 中的值(如 traceID、requestID 等)。

(2)手动传递父 ctx 中的值

在启动协程时,手动提取父 ctx 中的值(如 traceID、requestID 等),并将它们注入到新的 context 中。

func handler(c *gin.Context) {// 从父 ctx 中提取 traceID 和其他信息traceID := trace.SpanFromContext(c.Request.Context()).SpanContext().TraceID().String()requestID := c.GetString(string(log.RequestID))// 创建一个新的、独立的 context,并注入 traceID 和其他信息asyncCtx := context.Background()asyncCtx = context.WithValue(asyncCtx, "traceID", traceID)asyncCtx = context.WithValue(asyncCtx, log.RequestID, requestID)

缺点:
需要手动提取和注入值,代码稍显冗长。

(3)使用 context.WithoutCancel(Go 1.21+)

在 Go 1.21 及以上版本中,可以使用 context.WithoutCancel 创建一个不受父 ctx 取消影响的 context。

func handler(c *gin.Context) {// 使用 context.WithoutCancel 创建一个不受父 ctx 取消影响的 contextasyncCtx := context.WithoutCancel(c.Request.Context())// 启动协程,并传递新的 contextgo asyncTask(asyncCtx)
}func asyncTask(ctx context.Context) {// 执行任务log.Info("Async task started")time.Sleep(5 * time.Second)log.Info("Async task completed")
}

context.WithoutCancel

context.WithoutCancel(ctx) 是一个非常方便的工具,尤其是在 Go 1.21 及以上版本中。它可以直接创建一个不受父 context.Context 取消影响的子 context,同时继承父 ctx 中的所有值(如 traceID、requestID 等)。这样你既不需要手动提取和传递值,也不需要担心父 ctx 被取消后影响协程任务的执行

context.WithoutCancel(ctx) 是最方便的方式,尤其是在 Go 1.21 及以上版本中。它可以直接创建一个不受父 ctx 取消影响的 context,同时继承父 ctx 中的所有值,避免了手动提取和传递值的繁琐操作。

context.WithoutCancel 的优势

  • 继承父 ctx 中的所有值:
    context.WithoutCancel(ctx) 会继承父 ctx 中的所有值(如 traceID、requestID 等),无需手动提取和传递。
  • 不受父 ctx 取消的影响:
    即使父 ctx 被取消,context.WithoutCancel(ctx) 返回的 context 也不会被取消,协程任务可以继续执行。
  • 代码简洁:
    使用 context.WithoutCancel(ctx) 可以避免手动创建独立的 context 或提取和传递值的繁琐操作。

context.WithoutCancel 的注意事项

  • Go 版本要求:
    context.WithoutCancel 是 Go 1.21 引入的新功能,确保你的 Go 版本在 1.21 及以上。
  • 资源管理:
    即使父 ctx 被取消,context.WithoutCancel(ctx) 返回的 context 也不会被取消。因此,需要确保协程任务能够正常结束,避免资源泄漏
    值继承:
  • context.WithoutCancel(ctx) 会继承父 ctx 中的所有值,但不会继承父 ctx 的取消信号或超时设置。
http://www.dtcms.com/wzjs/398210.html

相关文章:

  • 1个ip可以做几个网站吗关键词工具
  • 优化网站的网站广告联盟自动挂机赚钱
  • index网站制作哪里有竞价推广托管
  • 网站优化seo推广服务站长工具seo综合
  • 卡通网站建设南昌seo技术外包
  • 音乐网站系统怎么做西安百度竞价托管代运营
  • 网站开发项目进度安排网站加速器
  • 做商城网站的公司推荐优化软件
  • 做网站如何网站考虑优化google安卓手机下载
  • 国内优秀网页上海百网优seo优化公司
  • 设计素材网站 ps外贸建站推广公司
  • html网页模板网站网站优化网
  • 中山做企业网站网站推广找客户
  • 淘宝店铺怎么上传自己做的网站百度文库官网首页
  • 网站开发平台的公司游戏推广员拉人犯法吗
  • wordpress站做app百度识图网页版入口
  • 自己做的网站能上传到凡科吗网站建设的六个步骤
  • 做吃的网站泉州seo报价
  • 网站上微信引流怎么做的苏州seo关键词优化外包
  • 网站开发与软件销售福州关键词排名软件
  • 重庆的网站建设公司排名检测
  • 夫妻网络网站建设东莞百度seo排名
  • wordpress挂件seo引擎优化是什么
  • 运营企业网站怎么赚钱深圳网络推广公司有哪些
  • 华为网络服务商杭州seo按天计费
  • 网站建设一条龙全包石家庄seo排名外包
  • 高大上的企业网站网页制作软件推荐
  • wordpress添加页脚QQ图标重庆自动seo
  • wordpress文章分页标题seo的排名机制
  • 这样做的网站做竞价托管的公司