WithCancel
package main
import (
"fmt"
"time"
"context"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
//同时取消两个协程
go doDB1Query(ctx)
go doDB2Query(ctx)
time.Sleep(3 * time.Second)
cancel() //取消两个协程
for {
;
}
}
func doDB1Query(ctx context.Context) {
fmt.Println("11")
for {
select {
case <-ctx.Done():
fmt.Println("11ctx done.")
return
default:
time.Sleep(time.Second)
fmt.Println("db11 waiting db")
}
}
}
func doDB2Query(ctx context.Context) {
fmt.Println("22")
for {
select {
case <-ctx.Done():
fmt.Println("22ctx done.")
return
default:
time.Sleep(time.Second)
fmt.Println("db22 waiting db")
}
}
}
WithTimeout
package main
import (
"fmt"
"time"
"context"
)
func main() {
timeout := 2 * time.Second
ctx, cancel := context.WithTimeout(context.Background(), timeout)
go Add(ctx)
fmt.Println("现在开始等待8秒,time=", time.Now().Unix())
time.Sleep(8 * time.Second)
fmt.Println("等待8秒结束,准备调用cancel()函数,发现两个子协程已经结束了,time=", time.Now().Unix())
cancel()// 手动退出还没运行,程序因为超时儿关闭
}
func Add(ctx context.Context){
for{
select {
case <-ctx.Done():
fmt.Println("退出")
return
default:
time.Sleep(time.Second)
fmt.Println("6666")
}
}
}
WithValue
package main
import (
"fmt"
"time"
"context"
)
type Options struct {
InterVal time.Duration
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
valueTX := context.WithValue(ctx, "Options", &Options{1} )
go doDB2Q(valueTX)
time.Sleep(3 * time.Second)
cancel()
for {
;
}
}
func doDB2Q(ctx context.Context) {
fmt.Println("22")
for {
select {
case <-ctx.Done():
fmt.Println("22ctx done.")
return
default:
op := ctx.Value("Options")
fmt.Println(op)
}
}
}
WithDeadline
和WithTimeout类似
package main
import (
"fmt"
"time"
"context"
)
func main() {
//十秒后自动退出
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(10 * time.Second))
defer cancel()
go DB(ctx)
for {
;
}
}
func DB(ctx context.Context) {
fmt.Println("db start")
for {
select {
case <-ctx.Done():
fmt.Println("db done.")
return
default:
fmt.Println("db ing")
time.Sleep(time.Second)
}
}
}