zoukankan      html  css  js  c++  java
  • ContextBase

    ContextBase

    Context的API和主要的两种函数

    type Context

    A Context carries a deadline, a cancellation signal, and other values across API boundaries.

    Context's methods may be called by multiple goroutines simultaneously.

    Context's methods may be called by multiple goroutines simultaneously.

    上下文跨API边界携带期限、取消信号和其他值。Context的方法可以被多个goroutines同时调用。

    type Context interface {
        // Deadline returns the time when work done on behalf of this context
        // should be canceled. Deadline returns ok==false when no deadline is
        // set. Successive calls to Deadline return the same results.
        Deadline() (deadline time.Time, ok bool)
    
        // Done returns a channel that's closed when work done on behalf of this
        // context should be canceled. Done may return nil if this context can
        // never be canceled. Successive calls to Done return the same value.
        // The close of the Done channel may happen asynchronously,
        // after the cancel function returns.
        //
        // WithCancel arranges for Done to be closed when cancel is called;
        // WithDeadline arranges for Done to be closed when the deadline
        // expires; WithTimeout arranges for Done to be closed when the timeout
        // elapses.
        //
        // Done is provided for use in select statements:
        //
        //  // Stream generates values with DoSomething and sends them to out
        //  // until DoSomething returns an error or ctx.Done is closed.
        //  func Stream(ctx context.Context, out chan<- Value) error {
        //  	for {
        //  		v, err := DoSomething(ctx)
        //  		if err != nil {
        //  			return err
        //  		}
        //  		select {
        //  		case <-ctx.Done():
        //  			return ctx.Err()
        //  		case out <- v:
        //  		}
        //  	}
        //  }
        //
        // See https://blog.golang.org/pipelines for more examples of how to use
        // a Done channel for cancellation.
        Done() <-chan struct{}
    
        // If Done is not yet closed, Err returns nil.
        // If Done is closed, Err returns a non-nil error explaining why:
        // Canceled if the context was canceled
        // or DeadlineExceeded if the context's deadline passed.
        // After Err returns a non-nil error, successive calls to Err return the same error.
        Err() error
    
        // Value returns the value associated with this context for key, or nil
        // if no value is associated with key. Successive calls to Value with
        // the same key returns the same result.
        //
        // Use context values only for request-scoped data that transits
        // processes and API boundaries, not for passing optional parameters to
        // functions.
        //
        // A key identifies a specific value in a Context. Functions that wish
        // to store values in Context typically allocate a key in a global
        // variable then use that key as the argument to context.WithValue and
        // Context.Value. A key can be any type that supports equality;
        // packages should define keys as an unexported type to avoid
        // collisions.
        //
        // Packages that define a Context key should provide type-safe accessors
        // for the values stored using that key:
        //
        // 	// Package user defines a User type that's stored in Contexts.
        // 	package user
        //
        // 	import "context"
        //
        // 	// User is the type of value stored in the Contexts.
        // 	type User struct {...}
        //
        // 	// key is an unexported type for keys defined in this package.
        // 	// This prevents collisions with keys defined in other packages.
        // 	type key int
        //
        // 	// userKey is the key for user.User values in Contexts. It is
        // 	// unexported; clients use user.NewContext and user.FromContext
        // 	// instead of using this key directly.
        // 	var userKey key
        //
        // 	// NewContext returns a new Context that carries value u.
        // 	func NewContext(ctx context.Context, u *User) context.Context {
        // 		return context.WithValue(ctx, userKey, u)
        // 	}
        //
        // 	// FromContext returns the User value stored in ctx, if any.
        // 	func FromContext(ctx context.Context) (*User, bool) {
        // 		u, ok := ctx.Value(userKey).(*User)
        // 		return u, ok
        // 	}
        Value(key interface{}) interface{}
    }
    

    func BackGround

    Background returns a non-nil, empty Context. It is never canceled, has no values, and has no deadline. It is typically used by the main function, initialization, and tests, and as the top-level Context for incoming requests.

    返回一个非nil的空上下文。它永远不会被取消,没有值,也没有截止日期。它通常用于主函数、初始化和测试,并作为传入请求的顶级上下文。也就是说,最上级和main.go常用

    func Background() Context
    

    func TODO

    TODO returns a non-nil, empty Context. Code should use context.TODO when it's unclear which Context to use or it is not yet available (because the surrounding function has not yet been extended to accept a Context parameter).

    TODO返回一个非nil的空上下文。代码应该使用上下文。当不清楚要使用哪个上下文或者上下文还不可用(因为周围的函数还没有扩展到接受上下文参数)时,可以使用TODO。

    func TODO() Context
    

    func WithCancel

    WithCancel returns a copy of parent with a new Done channel. The returned context's Done channel is closed when the returned cancel function is called or when the parent context's Done channel is closed, whichever happens first.

    Canceling this context releases resources associated with it, so code should call cancel as soon as the operations running in this Context complete.

    WithCancel返回带有新Done通道的父节点的副本。当返回的cancel函数被调用时,或当父上下文的Done通道被关闭时,返回的上下文的Done通道被关闭(无论哪个先发生)。取消这个上下文会释放与其关联的资源,因此代码应该在这个上下文中运行的操作完成后立即调用cancel。

    func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
    

    demo

    package main
    
    import (
    	"context"
    	"fmt"
    )
    
    func main() {
    	// gen generates integers in a separate goroutine and
    	// sends them to the returned channel.
    	// The callers of gen need to cancel the context once
    	// they are done consuming generated integers not to leak
    	// the internal goroutine started by gen.
    	gen := func(ctx context.Context) <-chan int {
    		dst := make(chan int)
    		n := 1
    		go func() {
    			for {
    				select {
    				case <-ctx.Done():
    					return // returning not to leak the goroutine
    				case dst <- n:
    					n++
    				}
    			}
    		}()
    		return dst
    	}
    
    	ctx, cancel := context.WithCancel(context.Background())
    	defer cancel() // cancel when we are finished consuming integers
    
    	for n := range gen(ctx) {
    		fmt.Println(n)
    		if n == 5 {
    			break
    		}
    	}
    }
    
    
    # 输出
    1
    2
    3
    4
    5
    

    func WithDeadline

    WithDeadline returns a copy of the parent context with the deadline adjusted to be no later than d. If the parent's deadline is already earlier than d, WithDeadline(parent, d) is semantically equivalent to parent. The returned context's Done channel is closed when the deadline expires, when the returned cancel function is called, or when the parent context's Done channel is closed, whichever happens first.

    Canceling this context releases resources associated with it, so code should call cancel as soon as the operations running in this Context complete.

    WithDeadline返回父上下文的一个副本,其截止日期调整为不迟于d。如果父上下文的截止日期已经早于d,那么WithDeadline(parent, d)在语义上等同于parent。当截止日期到期时,当返回的cancel函数被调用时,或者当父上下文的Done通道被关闭时(以最先发生的方式),返回上下文的Done通道被关闭。取消这个上下文会释放与其关联的资源,因此代码应该在这个上下文中运行的操作完成后立即调用cancel。

    func WithDeadline(parent Context, d time.Time) (Context, CancelFunc)
    

    demo

    // 和cancel相比  多了个过期时间
    package main
    
    import (
    	"context"
    	"fmt"
    	"time"
    )
    
    const shortDuration = 1 * time.Millisecond
    
    func main() {
    	d := time.Now().Add(shortDuration)
    	ctx, cancel := context.WithDeadline(context.Background(), d)
    
    	// Even though ctx will be expired, it is good practice to call its
    	// cancellation function in any case. Failure to do so may keep the
    	// context and its parent alive longer than necessary.
    	defer cancel()
    
    	select {
    	case <-time.After(1 * time.Second):
    		fmt.Println("overslept")
    	case <-ctx.Done():
    		fmt.Println(ctx.Err())
    	}
    }
    
    # 输出
    context deadline exceeded
    
  • 相关阅读:
    Python金融量化分析小白入门篇之如何安装Tushare模块
    InvalidSpecError: Invalid spec: =2.7报错解决办法
    windows10安装集成环境wampserver,刚开始可以用图标是绿色的,但是过一段时间,启动后呈橙色,重启也不行
    Java代码写完如何打包成程序?.jar包如何转成.exe文件?
    C#通过虚方法实现多态性,具体要求如下:1、创建基类Cuboid(长方体)及带有三个参数(长、宽、高)的构造函数。2、使用virtual关键字创建Cuboid类的Cubage()方法(虚方法)。3、创建Cuboid类的派生类Cube(正方体),并使用override关键字创建与Cuboid类中同名的Cubage()方法,实现多态。
    用C#设计两个类,一个描述点,另一个描述圆。圆由圆心和半径构成,圆类由点类派生而来,其中圆心的特性描述由点类继承下来。要求:圆类提供求圆面积的成员函数;支持初始化的带参构造函数;取得圆心坐标的两个函数。
    C#程序填空题,根据注释内容,填补程序空白部分。
    在C#中readonly成员:判断对错。
    毕业设计第四次任务书
    毕业设计第三次任务书
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14126546.html
Copyright © 2011-2022 走看看