超时处理应该这么做
1、超时处理有问题代码
只通过select监听超时信号,没有处理正常逻辑处理。
package main
import (
"context"
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func main() {
// 定义一个3s超时context 所有衍生出来的goroutine必须在3s内完成 否则会cancel掉
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
go func() {
wg.Add(2)
go watch(ctx, 1)
go watch(ctx, 2)
wg.Wait()
}()
// 这里有问题,因为不管是超时还是未超时都会进入<-ctx.Done() 也就是都会等待3s 这不是我们想要的
select {
case <-ctx.Done():
fmt.Printf("watch %d %s\n", 0, ctx.Err())
}
fmt.Println("finished")
}
func watch(ctx context.Context, flag int) {
defer wg.Done()
func() {
fmt.Printf("doing something flag:%d\n", flag)
time.Sleep(10*time.Second)
fmt.Println("finished flag:", flag)
}()
}复制
2、如何解决?
很简单,就是在所有goroutine结束之后发送一个done信号给主goroutine,这样select就会监听到这个信号,从而安全退出。
// 增加done信号
done := make(chan struct{})
go func() {
wg.Add(2)
go watch(ctx, 1)
go watch(ctx, 2)
wg.Wait()
done <- struct{}{} // 发送done信号
}()
select {
case <-done: // 接受done信号
fmt.Println("Done")
case <-ctx.Done():
fmt.Printf("watch %d %s\n", 0, ctx.Err())
}复制
文章转载自堆栈future,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
MogDB 发布更新,解决 openGauss 数据库在长事务情况下Ustore表膨胀问题
MogDB
287次阅读
2025-04-17 10:41:41
Oracle数据库常用脚本(八)
hongg
59次阅读
2025-04-02 09:09:23
【干货】磐维数据库-磐维删除分区数据测试
磐维数据库
57次阅读
2025-04-24 19:53:42
PLSQL编程
芃芃
50次阅读
2025-03-29 21:17:38
MySQL数据库“干货”来袭!41个常用脚本,速来领取
青年数据库学习互助会
49次阅读
2025-03-31 10:03:01
Oracle数据库常用脚本(六)
lh11811
43次阅读
2025-03-31 09:40:05
Oracle函数
芃芃
43次阅读
2025-03-28 18:37:13
MySQL数据库常用的41个脚本,速来下载!
小周的数据库进阶之路
42次阅读
2025-04-14 09:40:54
“G”术时刻:资深工程师揭秘GBase数据库Hint核心技巧 实现SQL性能跃升
GBASE数据库
41次阅读
2025-04-25 10:10:28
数据库SQL优化大总结之 百万级数据库优化方案
听溪
41次阅读
2025-04-01 20:55:52