context包探究

Mrwxj發表於2018-03-16

最近做專案的時候用到攜程同步,我想到的是sync包,具體做法如下sync同步

被別人安利說context包做協程之間同步是不錯的選擇,於是初步嘗試了一下

package TestProject

import (
    "context"
    "fmt"
    "time"
    "testing"
)

/*
    在這裡我認為context.WithCancel返回的上下文物件、cancel函式
    使用場景ABC……
    統一對ABC停止- -!我只能想到這些
 */
func Test_ContextWithCancel(t *testing.T)  {
    ctx,cancel:=context.WithCancel(context.Background())
    go printx(ctx)
    time.Sleep(5*time.Second)
    cancel()
    time.Sleep(1*time.Second)
}

/*
    ABC……超時停止- -!
 */
func Test_ContextWithTimeout(t *testing.T)  {
    ctx,cancel:=context.WithTimeout(context.Background(),4*time.Second)
    go printx(ctx)
    time.Sleep(5*time.Second)
    cancel()
    time.Sleep(time.Second)

}

/*
    ABC……直到某個時刻去停止
 */
func Test_ContextWithDeadLine(t *testing.T)  {
    ctx,cancel:=context.WithDeadline(context.Background(),time.Now().Add(4*time.Second))
    go printx(ctx)
    time.Sleep(5*time.Second)
    cancel()
    time.Sleep(time.Second)
}

/*
    ABC……同時引用上下文中的值?下面是一處使用場景
    // NewContext returns a new Context carrying userIP.
    func NewContext(ctx context.Context, userIP net.IP) context.Context {
        return context.WithValue(ctx, userIPKey, userIP)
    }

    // FromContext extracts the user IP address from ctx, if present.
    func FromContext(ctx context.Context) (net.IP, bool) {
      // ctx.Value returns nil if ctx has no value for the key;
      // the net.IP type assertion returns ok=false for nil.
        userIP, ok := ctx.Value(userIPKey).(net.IP)
        return userIP, ok
    }
*/
func Test_ContextWithValue(t *testing.T)  {
    ctx:=context.WithValue(context.Background(),"key","value")
    go printx(ctx)
    time.Sleep(5*time.Second)
}

func printx(ctx context.Context)  {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("over")
            return
        default:
            fmt.Println("xxx\n")
            if ctx.Value("key")!=nil{
                fmt.Println(ctx.Value("key").(string)+"\n")
            }
            time.Sleep(time.Second)

        }
    }
}

但是不理解具體應用場景,有

大佬 --help

一下嗎?

相關文章