zoukankan      html  css  js  c++  java
  • 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()
    }
     
     
  • 相关阅读:
    【书签】数据可视化(三)- Seaborn简易入门
    【书签】连续型特征的归一化和离散特征的one-hot编码
    【书签】转:对SVM的个人理解---浅显易懂
    【书签】stacking、blending
    【书签】机器学习相关
    正则表达式:匹配单个数字重复n次
    pandas删除DataFrame中任意字段等于'null'字符串的行
    中文的csv文件的编码改成utf-8的方法
    Eslint 从入门到放弃
    图片压缩的网站工具https://tinypng.com/
  • 原文地址:https://www.cnblogs.com/itsuibi/p/14490159.html
Copyright © 2011-2022 走看看