go context 读代码

...占位

1, 例子理解

// from https://blog.csdn.net/u011957758/article/details/82948750

package main

import (
	"context"
	"fmt"
	"math/rand"
	"time"
)
/*
1, main 和 chiHanBao 数据沟通
   main 通过 chan eatNum 从函数ChiHanBao 中读取数据
2, main 对 ChiHanBao的控制
   main 通过 cancel 影响 ctx ,影响 <-ctx.Done() ,实现对ChiHanBao的控制
3, cancel() 触发 ctx.Done 发动 */ func main() { ctx, cancel := context.WithCancel(context.Background()) eatNum := chiHanBao(ctx) for n := range eatNum { if n >= 10 { cancel() break } } fmt.Println("正在统计结果。。。") time.Sleep(1 * time.Second) } func chiHanBao(ctx context.Context) <-chan int { c := make(chan int) // 个数 n := 0 // 时间 t := 0 go func() { for { //time.Sleep(time.Second) select { case <-ctx.Done(): fmt.Printf("耗时 %d 秒,吃了 %d 个汉堡 \n", t, n) return case c <- n: incr := rand.Intn(5) n += incr if n >= 10 { n = 10 } t++ fmt.Printf("我吃了 %d 个汉堡\n", n) } } }() return c }

2,...和第一个例子差不多

func main() {
    // ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(10))
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	chiHanBao(ctx)
	defer cancel()
}

func chiHanBao(ctx context.Context) {
	n := 0
	for {
		select {
		case <-ctx.Done():
			fmt.Println("stop \n")
			return
		default:
			incr := rand.Intn(5)
			n += incr
			fmt.Printf("我吃了 %d 个汉堡\n", n)
		}
		time.Sleep(time.Second)
	}
}

3,...生效时刻

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	go func() {
		// 服务连接
		if config.SslConfig.Enable {
			if err := srv.ListenAndServeTLS(config.SslConfig.Pem, config.SslConfig.KeyStr); err != nil && err != http.ErrServerClosed {
				log.Fatal("listen: ", err)
			}
		} else {
			if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
				log.Fatal("listen: ", err)
			}
		}
	}()
	// 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
	quit := make(chan os.Signal)
	signal.Notify(quit, os.Interrupt)
	<-quit
	fmt.Printf("%s Shutdown Server ... \r\n", pkg.GetCurrentTimeStr())
//  <-quit 会阻塞, 经过N久后,等用户输入了 Ctrl+C,=>srv.Shutdown(ctx),    context.WithTimeout中的超时5秒才生效
	if err := srv.Shutdown(ctx); err != nil {
		log.Fatal("Server Shutdown:", err)
	}
	log.Println("Server exiting")

4... withvalue

package main

import (
	"context"
	"log"
)

type Huzh string
type H1 struct {}

func main() {
	//ctx, cancle := context.WithTimeout(context.Background(), 5*time.Second)
	val1 := context.WithValue(context.Background(),Huzh("xx"),"hello")
	val2 := context.WithValue(context.Background(),H1{},"hello")
	ctxhand(val1,val2)
	log.Println("main exit")

}

func ctxhand(ctx1,ctx2 context.Context) {
	log.Println(ctx1.Value(Huzh("xx")))
	log.Println(ctx2.Value(H1{}))
}


===============
C:\Users\huzh\AppData\Local\Temp\___go_build_m_go.exe #gosetup
2021/07/07 22:18:34 hello
2021/07/07 22:18:34 hello
2021/07/07 22:18:34 main exit

  

posted @ 2021-05-18 15:15  voh99800  阅读(60)  评论(0编辑  收藏  举报