前言

goroutine

Timer

Time.After(d Duration)

output:

2021-10-27 23:06:04.304596 +0800 CST m=+0.000085653
2021-10-27 23:06:07.306311 +0800 CST m=+3.001711390

time.After()ChannelChannel

有了这个特性就可以实现一些异步控制超时的场景:

goroutinechannelgoroutinegoroutine

output:

do something...
timeout

timer.After 取消,同时 Channel 发出消息,也可以关闭通道等通知方式。

注意 Channel 最好是有大小,防止阻塞 goroutine ,导致泄露。

Context

第二种方案是利用 context,go 的 context 功能强大;


context.WithTimeout()
contextDone()channelchannel

timout context deadline exceeded

timeout.Err()context 

goroutine 传递 context

context
goroutinecontextcontext
cancelFunc()

Gin 中的案例

Shutdown(ctx)context

Gin

总结

因为写 go 的时间不长,所以自己写了一个练手的项目:一个接口压力测试工具。


go