2狠狠做网站,做网站那些好,wordpress login_head,网站数据库安全简言 WithCancel()函数接受一个 Context 并返回其子Context和取消函数cancel 新创建协程中传入子Context做参数#xff0c;且需监控子Context的Done通道#xff0c;若收到消息#xff0c;则退出 需要新协程结束时#xff0c;在外面调用 cancel 函数#xff0c;即会往子C…简言 WithCancel()函数接受一个 Context 并返回其子Context和取消函数cancel 新创建协程中传入子Context做参数且需监控子Context的Done通道若收到消息则退出 需要新协程结束时在外面调用 cancel 函数即会往子Context的Done通道发送消息 注意当 父Context的 Done() 关闭的时候子 ctx 的 Done() 也会被关闭
实验步骤 利用根Context创建一个父Context使用父Context创建一个协程 利用上面的父Context再创建一个子Context使用该子Context创建一个协程 一段时间后调用父Context的cancel函数会发现父Context的协程和子Context的协程都收到了信号被结束了
package main
import (contextfmtlogostime
)
func ctxjob() {ctx : context.Background()subctx, c : context.WithCancel(ctx)action : func(sctx context.Context, id int) {for {select {case -sctx.Done():fmt.Println(action done exit., id)returndefault:fmt.Println(action running..., id)time.Sleep(1 * time.Second)}}}go action(subctx, 1)sub2ctx, _ : context.WithCancel(subctx)go action(sub2ctx, 2)time.Sleep(10 * time.Second)fmt.Println(stop action)c()time.Sleep(1 * time.Second)fmt.Println(stop action done.)}
func main() {// pullRedis()ctxjob()
}输出
PS E:\bug\go-leo-t go build main.go
PS E:\bug\go-leo-t .\main.exe
action running... 2
action running... 1
action running... 1
action running... 2
action running... 1
action running... 2
action running... 2
action running... 1
action running... 1
action running... 2
action running... 2
action running... 1
action running... 2
action running... 1
action running... 1
action running... 2
action running... 2
action running... 1
action running... 1
action running... 2
stop action
action done exit. 2
action done exit. 1
stop action done.