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

一个人可以做网站免费建站模板

一个人可以做网站,免费建站模板,商务型网站建设,推广自己的产品[Golang] Context 文章目录 [Golang] Context什么是context创建context创建根context创建context context的作用并发控制context.WithCancelcontext.WithDeadlinecontext.WithTimeoutcontext.WithValue 什么是context Golang在1.7版本中引入了一个标准库的接口context#xf…[Golang] Context 文章目录 [Golang] Context什么是context创建context创建根context创建context context的作用并发控制context.WithCancelcontext.WithDeadlinecontext.WithTimeoutcontext.WithValue 什么是context Golang在1.7版本中引入了一个标准库的接口context定义 type Context interface {Deadline() (deadline time.Time, ok bool)Done() -chan struct{}Err() errorValue(key any) any }它定义了四个方法 Deadline设置context.Context被取消的时间即截止日期 Done返回一个只读channel当Context到达截止日期时或被取消这个channel就会被关闭表示Context的链路结束多次调用Done会返回同一个channel Err返回Context结束的原因它只会在Done返回的channel被关闭时才会返回非空的值 情况1Context被取消返回Canceled情况2Context超时返回DeadlineExceeded Value从context.Context中获取键对应的值类似与map的get方法对于同一个Context多次调用Value并传入相同的key会返回相同的结果如果没有对应的key就返回nil。 键值对通过WithValue方法写入 func WithValue(parent Context, key, val any) Context {if parent nil {panic(cannot create context from nil parent)}if key nil {panic(nil key)}if !reflectlite.TypeOf(key).Comparable() {panic(key is not comparable)}return valueCtx{parent, key, val} }创建context 创建根context 两种方法 context.Background()context.TODO() 两者没有什么太多的区别都是创建根context根context是一个空的context不具备任何功能。 一般情况下当前函数没有上下文作为入参我们就使用context.Background()创建一个根context作为起始的上下文向下传递。 创建context 根context被创建后不具备任何功能为了让context在程序中发挥作用我们需要依靠包提供的With系列函数来进行派生。 四个派生函数 func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {...} func WithDeadline(parent Context, d time.Time) (Context, CancelFunc) {...} func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {...} func WithValue(parent Context, key, val any) Context {...}基于当前context每个With函数都会创建出一个新的context这类似于我们熟悉的树结构当前context称为父context派生出的每个新context被称为子context。 通过根context的四个With函数派生出四种类型的context每种context又可以通过同样的方式调用with系列方法继续向下派生出新的context整体结构像一个树一样。 context的作用 用于并发控制控制协程的退出上下文信息的传递 总的来说就是用来在父子goroutine间进行值传递和发生cancel信号的一种机制。 并发控制 一般的服务器都是一直运行的等待客户端或者浏览器的请求做出响应思考这种场景一个微服务架构中下服务器收到一个请求后并不会在一个goroutine下完成(如果逻辑复杂)而是创建很多goroutine共同完成这个请求。 假设有rpc1—rpc2—rpc3—rpc4—rpc55个rpc调用。 但是如果在整个rpc调用中如果rpc1就出现了错误如果没有context存在服务器就会坚持调用完整个流程也就是等待所有rpc调用完成后才能返回结果但是实际上这样浪费了不少的时间单纯浪费计算和IO资源(rpc1错误之后的rpc调用都是无用功)。因为rpc调用之间不知道已经产生了错误而context就很好的解决了这个问题。 在不需要子goroutine继续执行的时候通过context通知子goroutine关闭即可。 context.WithCancel func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {c : withCancel(parent)return c, func() { c.cancel(true, Canceled, nil) } }context.WithCancel函数是一个取消控制函数只需要一个context作为参数能够衍生出一个新的子context和取消函数Cancel我们可以通过这个将这个子context传入子goroutine中执行Cancel函数来关闭这个子goroutine当前的上下文和它的子上下文都会被取消所有的goroutine都会同步收到取消信号。 示例 package mainimport (contextfmttime )func main() {fmt.Println()ctx, cancel : context.WithCancel(context.Background())go watch(ctx, goroutine1)go watch(ctx, goroutine2)time.Sleep(3 * time.Second)fmt.Println(end!!!)cancel()time.Sleep(time.Second) } func watch(ctx context.Context, name string) {for {select {case -ctx.Done():fmt.Println(name, exit)returndefault:fmt.Println(name, watching)time.Sleep(time.Second)}} }执行结果 通过WithCancel函数派生出一个带有返回函数cancel的ctxctx, cancel : context.WithCancel(context.Background())并且把ctx传入子goroutine中在3秒内没有执行cancel子goroutine将一直执行default语句3秒后执行cancel此时子goroutine从ctx.Done()收到消息执行return结束。 context.WithDeadline func WithDeadline(parent Context, d time.Time) (Context, CancelFunc) {return WithDeadlineCause(parent, d, nil) }context.WithDeadline函数也是一个取消控制函数共有两个参数一个是context另一个是截止时间同样会返回一个子context和取消函数cancel。在使用时如果没有到截止日期我们可以通过调用cancel函数来手动取消context控制goroutine的退出如果到了截止日期我们都没有调用cancel函数子context的Done()管道也会收到一个取消信号来控制子goroutine的退出。 示例 package mainimport (contextfmttime )func main() {fmt.Println()ctx, cancel : context.WithDeadline(context.Background(), time.Now().Add(3*time.Second))defer cancel()go watch(ctx, goroutine1)go watch(ctx, goroutine2)// 让goroutine1和goroutine2先执行5秒time.Sleep(5 * time.Second)fmt.Println(end!!!)} func watch(ctx context.Context, name string) {for {select {case -ctx.Done()://但是不到5秒3秒时收到了退出信号fmt.Println(name, exit)returndefault:fmt.Println(name, watching)time.Sleep(time.Second)}} }执行结果 我们并没有调用cancel函数但是在过了3秒后子goroutine里ctx.Done()收到了信号子goroutine进行退出。 context.WithTimeout func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {return WithDeadline(parent, time.Now().Add(timeout)) }context.WithTimeout和context.WithDeadline差不多都是用于超时取消子context只是第二个参数有点区别不是具体时间而是时间长度。 示例 package mainimport (contextfmttime )func main() {fmt.Println()ctx, cancel : context.WithTimeout(context.Background(), 3*time.Second)defer cancel()go watch(ctx, goroutine1)go watch(ctx, goroutine2)// 让goroutine1和goroutine2先执行5秒time.Sleep(5 * time.Second)fmt.Println(end!!!)} func watch(ctx context.Context, name string) {for {select {case -ctx.Done()://但是不到5秒3秒时收到了退出信号fmt.Println(name, exit)returndefault:fmt.Println(name, watching)time.Sleep(time.Second)}} }执行结果 执行结果和context.WithDeadline类似。 context.WithValue func WithValue(parent Context, key, val any) Context {if parent nil {panic(cannot create context from nil parent)}if key nil {panic(nil key)}if !reflectlite.TypeOf(key).Comparable() {panic(key is not comparable)}return valueCtx{parent, key, val} }context.WithValue函数从父context中创建一个子context用于传值函数参数是父context、key、val返回一个context。一般用于上下文信息的传递比如请求唯一id以及trace_id用于链路追踪以及配置穿透。 示例 package mainimport (contextfmttime )func main() {fmt.Println()ctx : context.WithValue(context.Background(), name, 张三)go func1(ctx)time.Sleep(time.Second) } func func1(ctx context.Context) {fmt.Println(name , ctx.Value(name).(string)) } 执行结果
http://www.hkea.cn/news/14582874/

相关文章:

  • 3liang 设计网站 源码wordpress分类目录 模版
  • 网站欢迎页面flash做家教的网站
  • 网站打不开怎么回事营销型网站的建设流程图
  • 建设银行手机银行网站登录wordpress批量上传图片
  • 如何查询网站备案信息能不能同行网站做站长统计
  • 怎么兼职做网站手机短视频网站的建设
  • 专业制作网站用哪些软件帝国cms资源网模板
  • 做网站推广个人做网站排版
  • 网站建设推广平台有哪些方面做动画的网站有哪些
  • 能看网站的视频app如何做网站卖画
  • 可以查企业备案的网站吗外贸公司怎么做网站
  • 织梦做的网站别人提交给我留的言我去哪里看泰安专业的网络推广公司
  • 外卖网站开发方案抖音网站表白怎么做
  • 平面设计师磨刀石湖南网站推广优化
  • 网站界面布局电商小程序介绍
  • 网站可以做什么企业建站都有什么网站
  • 六师五家渠市建设局网站网站毕设代做多少钱
  • 网站开发的软件支持在线购物系统的分析与设计
  • 广东峰凌建设有限公司网站手机版网页制作
  • 丰台网站制作公司网站建设案例教程视频
  • 鞍山做网站优化网上做衣服的网站
  • ext做的网站有那些怎么做一个手机网站
  • 江苏广兴建设集团网站苏州网站建设开发公司
  • 网站备案要营业执照原件吗网站文章展示是做怎么
  • 重庆网站建站价格个人简历自我介绍200字
  • 网站开发专业有哪些网站开发前端需要学什么
  • 百度做网站续费费用单页网站作用是什么
  • 做旅游计划的网站兰州新区小程序建站
  • 广东泰通建设有限公司网站网站建设有哪些文件
  • 网站源码安全吗商标注册多少钱