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

酷炫的网站欢迎页面龙网网络推广软件

酷炫的网站欢迎页面,龙网网络推广软件,小程序变成网页链接,网站开发技术书籍0 概述 Context 是 Go 语言中非常重要的一个概念,它主要用于跨多个函数或 goroutine 传递 取消信号、超时控制、截止时间 和 请求范围数据。在并发编程中,Context 提供了更好的控制和管理,尤其是当你需要在多个 goroutine 之间传递状态或进行…

0 概述

Context 是 Go 语言中非常重要的一个概念,它主要用于跨多个函数或 goroutine 传递 取消信号超时控制截止时间请求范围数据。在并发编程中,Context 提供了更好的控制和管理,尤其是当你需要在多个 goroutine 之间传递状态或进行资源清理时。

1 主要功能

Context 主要有以下几个功能:

  • 取消信号:通知一个或多个 goroutine 取消它们正在执行的工作。
  • 超时和截止时间:指定操作的最大执行时间,防止阻塞操作过长时间。
  • 传递请求范围数据:携带请求范围内的数据,通常用于请求 ID、用户信息等。

2 Context 的三种基本类型

Go 中的 context 包提供了几种常用的 Context 类型:

  • context.Background():通常作为根 Context,表示没有附加数据或取消信号的上下文。它通常是根上下文,作为其他上下文的父上下文。
  • context.TODO():表示你暂时没有确定使用什么样的 Context,通常用于占位。
  • context.WithCancel(parent):创建一个可取消的 Context,并返回一个取消函数,当你调用这个函数时,Context 会被取消。
  • context.WithTimeout(parent, timeout):创建一个带有超时的 Context,指定最大等待时间,超过这个时间会自动取消。
  • context.WithDeadline(parent, deadline):指定一个具体的截止时间,超过这个时间后自动取消。
  • context.WithValue(parent, key, value):创建一个携带键值对数据的 Context,通常用于传递请求级别的数据(例如,用户身份信息)。

3 常见用法举例

3.1 context.WithCancel传递取消信号

主要场景:

  • 手动控制并发任务的终止
  • 优雅退出:在一个任务中途需要取消时,用 cancel() 通知所有相关的 goroutine 停止执行。

代码示例:

package mainimport ("context""fmt""time"
)func main() {// 创建一个可取消的 Contextctx, cancel := context.WithCancel(context.Background())// 启动一个 goroutine,监听取消信号go func(ctx context.Context) {for {select {case <-ctx.Done(): // 检测到取消信号fmt.Println("Goroutine stopped")returndefault:// 模拟工作fmt.Println("Working...")time.Sleep(1 * time.Second)}}}(ctx)// 主线程等待 3 秒后取消time.Sleep(3 * time.Second)cancel() // 发送取消信号// 等待 goroutine 退出time.Sleep(1 * time.Second)fmt.Println("Main program exited")
}

解释

  1. 主线程创建了一个带有取消功能的上下文 ctx
  2. 子 goroutine 使用 ctx.Done() 监听取消信号。
  3. 主线程 3 秒后调用 cancel(),子 goroutine 检测到信号后优雅退出。

3.2 使用 WithTimeout 设置超时

context.WithTimeout 用于设置一个超时时间,超过该时间后 Context 会自动取消,适用于需要限时执行的操作。防止某些任务阻塞的时间过长。

package mainimport ("context""fmt""time"
)func main() {// 设置超时时间为 2 秒ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)defer cancel() // 确保超时后取消 ctx// 启动一个模拟长时间执行的任务go longRunningTask(ctx)// 等待超时或任务完成<-ctx.Done()if ctx.Err() == context.DeadlineExceeded {fmt.Println("Timeout reached")}
}func longRunningTask(ctx context.Context) {select {case <-time.After(3 * time.Second): // 模拟长时间任务fmt.Println("Task completed")case <-ctx.Done():// 任务被取消或超时fmt.Println("Task cancelled due to timeout")}
}

WithDeadline 的用法和Withtimeout用法类似,只是一个传入的参数是等待时间,一个传入的参数是截止时间。

3.3 使用 WithValue 传递数据

context.WithValue 可以在 Context 中存储键值对,通常用于传递请求级别的数据(例如用户身份、请求 ID 等)。

package mainimport ("context""fmt"
)func main() {// 创建一个上下文并传递数据ctx := context.WithValue(context.Background(), "userID", 12345)// 将 ctx 传递给其他函数processRequest(ctx)
}func processRequest(ctx context.Context) {// 从 ctx 中提取数据userID := ctx.Value("userID")if userID != nil {fmt.Println("User ID:", userID)} else {fmt.Println("No user ID found")}
}

使用 WithValue 小心context.WithValue 并不是用于传递大量数据的,主要用于传递少量的上下文信息,比如请求 ID 等。如果传递过多的数据,会使得 Context 难以维护。

4 常用的相关方法和常量

  • ctx.Done():返回一个 channel,当 Context 被取消时该 channel 会被关闭。
  • ctx.Err():返回 Context 被取消的错误,通常是 context.Canceledcontext.DeadlineExceeded
  • ctx.Value(key):获取在 Context 中传递的数据。

5 context如何控制goroutine的执行

从上面的举例可以看出,在每个goroutine中通过判断ctx.Done()是否被执行,从而知道任务是否被取消/超时/到达截止日期。

Context 被取消(调用 cancel())或超时/到达截止时间时,ctx.Done() 所关联的 channel 会关闭,此时select语句就可以执行ctx.Done()对应的分支。

http://www.ritt.cn/news/18348.html

相关文章:

  • 腾讯建站平台官网网搜网
  • 黄骅做网站价格怎么做产品推广和宣传
  • 淄博百度网站建设企业文化培训
  • 百度给做网站吗个人对网络营销的看法
  • 广州网页设计师培训班seo搜索引擎优化内容
  • 鹤壁海绵城市建设官方网站seo推广教程seo高级教程
  • 学做美食视频网站有哪些燕郊今日头条
  • 做微信公众号的是哪个网站吗最简单的营销方案
  • centos7.4安装wordpress石家庄谷歌seo公司
  • 公司网站app怎么做沈阳seo代理计费
  • 专门做名片的网站广州营销seo
  • 自己动手建立网站3百度识图搜索网页版
  • 宁波网站怎么建设网站监测
  • 网站设计公司哪个好网站建设步骤流程详细介绍
  • 教程建设网站深圳百度网站排名优化
  • 做网站美工要学什么常用的关键词有哪些
  • 网站建设需要了解什么百度云盘下载
  • 中国十大网站域名手机seo排名
  • 网站快速收录平台网址提交百度收录
  • 网站建设标准合同书最近10个新闻
  • 微金所网站谁做的b站推广2024mmm已更新
  • 东莞建设建网站今日军事新闻最新消息新闻
  • 下关汇做网站的公司市场调研分析报告怎么写
  • 网站制作的企业有哪些新闻摘抄大全
  • 森普网站建设百度关键词搜索量排行
  • 社区网站制作教程百度快照搜索
  • 平台网站模板 优帮云seo网站排名助手
  • 郑州本地网站优化大师软件大全
  • 做黄色网站要学些什么网页搜索排名提升
  • 南通动态网站建设如何在百度打广告