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()
    }
     
     
  • 相关阅读:
    LVS的持久连接、会话保持和高可用介绍
    lvs整理
    ubuntu 12.04 下LVS的一些搭建心得和资料整理
    Ubuntu下配置LVS【h】
    关于vector push_back()与其他方式读取数据的效率对比(转)
    强大的vim配置文件,让编程更随意(转)
    E492: Not an editor command: ^M
    Building Vim from source(转)
    误删 libc.so.6的解决方法(转)
    CentOS安装glibc-2.14(转)
  • 原文地址:https://www.cnblogs.com/itsuibi/p/14490159.html
Copyright © 2011-2022 走看看