golang中context使用——WithTimeout和WithDeadline

golang中context使用——WithTimeout和WithDeadline
强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码

程序和上一篇的withCancel是类似的,只是创建子context的方式不同,这里使用的是withTimeout和WithDeadline的方式。

下面,上代码:

package main

import (
	"context"
	"errors"
	"fmt"
	"time"
)

var c = 1

func doSome(i int) error {
	c++
	fmt.Println(c)
	if c > 3 {
		return errors.New("err occur")
	}
	return nil
}

func speakMemo(ctx context.Context, cancelFunc context.CancelFunc) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("ctx.Done")
			return
		default:
			time.Sleep(1 * time.Second)
			fmt.Println("exec default func")
			err := doSome(3)
			if err != nil {
				fmt.Printf("cancelFunc()")
				cancelFunc()
			}
		}
	}
}

func main() {
	rootContext := context.Background()
	ctx, cancelFunc := context.WithTimeout(rootContext, time.Duration(1)*time.Second)
	//ctx2, cancelFunc2 := context.WithDeadline(rootContext, time.Now().Add(time.Duration(1)*time.Second))
	go speakMemo(ctx, cancelFunc)
	time.Sleep(time.Second * 5)
}

运行结果:

exec default func
2
ctx.Done

Process finished with exit code 0

 

注意,这里使用的WithTimeOut和WithDeadline作用和效果类似,只是传递的时间参数不同。

从结果中我们发现,程序并没有因为变量值变为3而退出,而是因为超时退出。

本文来源0day__,由javajgs_com转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/8096

发表评论