zoukankan      html  css  js  c++  java
  • golang中的context上下文

    Context是由Golang官方开发的并发控制包,一方面可以用于当请求超时或者取消时候,相关的goroutine马上退出释放资源,

    另一方面Context本身含义就是上下文,其可以在多个goroutine或者多个处理函数之间传递共享的信息。

    创建一个新的context,必须基于一个父context,新的context又可以作为其他context的父context。

    所有context在一起构造成一个context树。

    package main

    import (
    "context"
    "fmt"
    "math/rand"
    "runtime"
    "time"
    )

    func main(){
    //ctx 超时控制
    ctx,cancel:=context.WithTimeout(context.Background(),3*time.Second)
    defer cancel()
    go SlowOperation(ctx)
    go func() {
    for {
    time.Sleep(300*time.Microsecond)
    fmt.Println("goroutine:",runtime.NumGoroutine())
    }
    }()
    time.Sleep(4*time.Second)
    }

    func SlowOperation(ctx context.Context){
    done:=make(chan int,1)
    go func() {
    dur:=time.Duration(rand.Intn(5)+1)*time.Second
    time.Sleep(dur)
    done <- 1
    }()

    select {
    case <-ctx.Done():
    fmt.Println("slowOperation timeout:",ctx.Err())
    case <-done:
    fmt.Println("complete work")
    }
    }


    上面代码会不停打印当前groutine数量,可以观察到SlowOperation函数执行超时之后,goroutine数量由4个变成2个,相关goroutetine退出了

    type Context interface {
         Deadline() (deadline time.Time, ok bool)
      Done() <-chan struct{}
      Err() error
      Value(key interface{}) interface{}
    }

      Context接口一共包含四个方法:

    • Deadline:返回绑定该context任务的执行超时时间,若未设置,则ok等于false
    • Done:返回一个只读通道,当绑定该context的任务执行完成并调用cancel方法或者任务执行超时时候,该通道会被关闭
    • Err:返回一个错误,如果Done返回的通道未关闭则返回nil,如果context如果被取消,返回Canceled错误,如果超时则会返回DeadlineExceeded错误
    • Value:根据key返回,存储在context中k-v数据
  • 相关阅读:
    Fix The System Bell
    Autounlock default keyring during login KDE
    打油诗1
    Give your laptop some gaming power
    ubuntu 12.04 wine安装有道词典
    天津工业大学破烂综合教务系统非IE非Windows解决方案
    愤忿,愤,忿
    C Strings (Arrays vs. Pointers)
    深入学习算法的一点拙见
    jquery控制图片按比例缩放
  • 原文地址:https://www.cnblogs.com/webkaifazhe/p/14330718.html
Copyright © 2011-2022 走看看