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()
}
 
 
posted @ 2021-03-06 11:59  GPHPER  阅读(153)  评论(0编辑  收藏  举报
TOP