• golang学习笔记——context库


    WithCancel(主进程控制子协程关闭)
    package main
     
    import (
        "context"
        "fmt"
        "sync"
        "time"
    )
     
    var wg sync.WaitGroup
     
    func f(ctx context.Context) {
        defer wg.Done()
        LOOP:
        for {
             fmt.Println("hello world")
             time.Sleep(time.Millisecond * 500)
             select {
             case <-ctx.Done():
                     break LOOP
             default:
             }
        }
    }
     
    func main() {
        ctx, cancel := context.WithCancel(context.Background())
        wg.Add(1)
        go f(ctx)
        time.Sleep(time.Second * 5)
        //通知子协程退出
        cancel()
        wg.Wait()
    }
     
    WithTimeout(超时关闭)
    package main
     
    import (
        "context"
        "fmt"
        "sync"
        "time"
    )
     
    var wg sync.WaitGroup
     
    func f(ctx context.Context) {
        defer wg.Done()
        LOOP:
        for {
             fmt.Println("hello world")
             time.Sleep(time.Millisecond * 500)
             select {
             case <-ctx.Done(): //50毫秒自动调用
                     break LOOP
             default:
             }
        }
    }
     
    func main() {
        ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
        //通知子协程退出
        defer cancel()
        wg.Add(1)
        go f(ctx)
        time.Sleep(time.Second * 5)
        wg.Wait()
    }
     
    WithValue (key值不能为基础类型,应该用用户自定义的类型
    package main
     
    import (
        "context"
        "fmt"
        "sync"
        "time"
    )
     
    type cjp string
     
    var wg sync.WaitGroup
     
    func f(ctx context.Context) {
        defer wg.Done()
        LOOP:
        for {
             fmt.Println(ctx.Value(cjp("mt")))
             fmt.Println("hello world")
             time.Sleep(time.Millisecond * 500)
             select {
             case <-ctx.Done(): //50毫秒自动调用
                     break LOOP
             default:
             }
        }
    }
     
    func main() {
        ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
        defer cancel()
        ctx = context.WithValue(ctx, cjp("mt"), "cuijiapeng")
        wg.Add(1)
        go f(ctx)
        time.Sleep(time.Second * 5)
        wg.Wait()
    }
     
     
  • 相关阅读:
    String 方法
    异常处理
    数组长度改变方法
    对象
    重载(函数)
    函数
    java基础(死循环退出选项)
    cookie的封装,获取,删除
    事件监听的理解
    JS少数兼容
  • 原文地址:https://www.cnblogs.com/itsuibi/p/14490159.html
Copyright © 2020-2023  润新知