簡(jiǎn)言
-
WithCancel()函數(shù)接受一個(gè) Context 并返回其子Context和取消函數(shù)cancel
-
新創(chuàng)建協(xié)程中傳入子Context做參數(shù),且需監(jiān)控子Context的Done通道,若收到消息,則退出
-
需要新協(xié)程結(jié)束時(shí),在外面調(diào)用 cancel 函數(shù),即會(huì)往子Context的Done通道發(fā)送消息
-
注意:當(dāng) 父Context的 Done() 關(guān)閉的時(shí)候,子 ctx 的 Done() 也會(huì)被關(guān)閉
實(shí)驗(yàn)步驟
-
利用根Context創(chuàng)建一個(gè)父Context,使用父Context創(chuàng)建一個(gè)協(xié)程,
-
利用上面的父Context再創(chuàng)建一個(gè)子Context,使用該子Context創(chuàng)建一個(gè)協(xié)程
-
一段時(shí)間后,調(diào)用父Context的cancel函數(shù),會(huì)發(fā)現(xiàn)父Context的協(xié)程和子Context的協(xié)程都收到了信號(hào),被結(jié)束了文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-704959.html
package main
import (
"context"
"fmt"
"log"
"os"
"time"
)
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)
return
default:
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()
}
輸出:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-704959.html
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.
到了這里,關(guān)于golang之context實(shí)用記錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!