Golang Go语言中的超时控制和取消

发布于 1周前 作者 sinazl 来自 Go语言

在处理超时控制的时候,每个途经的 function 都需 handle ctx 是不是已经结束了吗? 例如: https://github.com/pagnihotry/golang_samples/blob/master/go_context_sample.go


Golang Go语言中的超时控制和取消

更多关于Golang Go语言中的超时控制和取消的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

涉及协程切换 且 内部没有基于 ctx 处理生命周期的操作需要(现在大多数库都支持了,没有的不是设计上有问题就是没人维护了)

更多关于Golang Go语言中的超时控制和取消的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


io 操作之前判断就行了, 一般的库都支持了。

找结构化并发的解决方案,
kotlin 的 Coroutines 在超时,Cancel 和异常处理得不错。
https://vorpus.org/blog/notes-on-structured-concurrency-or-go-statement-considered-harmful/

你要是代码里全是全局的 Func ,那确实。

在Golang(Go语言)中,超时控制和取消操作是并发编程中常见的需求,通常通过goroutines、channels以及context包来实现。

对于超时控制,可以使用time.Aftertime.NewTimer来创建一个超时计时器。例如,select语句可以监听一个操作完成的channel和一个超时channel,从而实现在规定时间内等待操作完成或触发超时处理。

select {
case res := <-opChannel:
    // 操作完成,处理结果
case <-time.After(timeoutDuration):
    // 超时处理
}

对于取消操作,context.Context是一个强大的工具。通过创建一个可取消的context(如context.WithCancelcontext.WithTimeoutcontext.WithDeadline),可以在goroutine中检查是否被取消,并作出相应处理。

ctx, cancel := context.WithTimeout(context.Background(), timeoutDuration)
defer cancel() // 确保资源释放

select {
case <-ctx.Done():
    if ctx.Err() == context.Canceled {
        // 被取消处理
    } else if ctx.Err() == context.DeadlineExceeded {
        // 超时处理
    }
case res := <-opChannel:
    // 操作完成,处理结果
}

这种组合使用selecttime包和context包的方式,使得Go语言在并发编程中能够优雅地处理超时和取消操作,提高了代码的健壮性和可维护性。

回到顶部