欢迎访问Ningto's博客

Menu
  • 首页
  • 归档
  • 关于
  • 书签
  • 必应壁纸
  • IT聚合
  • 工具
    • 我的工具列表
    • 我的网盘
    • 必应每日壁纸API
    • Html转Markdown
    • 仙尘光标
Menu

sync.WaitGroup增加timeout

最后更新 2020-04-29 07:52:02   阅读量 1395

要等待多个goroutine完成,我们可以使用sync.WaitGroup,但是它会一直等待,这里简单封装下增加超时机制。

直接上代码:

type WaitGroupTimeout struct {
    wg sync.WaitGroup
    done chan struct{}
    timeout time.Duration
}

func NewWaitGroupTimeout(timeout time.Duration)*WaitGroupTimeout {
    return &WaitGroupTimeout{
        done: make(chan struct{}),
        timeout: timeout,
    }
}

func(tw *WaitGroupTimeout)Add(delta int) {
    tw.wg.Add(delta)
}

func(tw *WaitGroupTimeout)Done() {
    tw.wg.Done()
}

func(tw *WaitGroupTimeout)Wait() {
    go func() {
        tw.wg.Wait()
        close(tw.done)
    }()
    select {
    case <- tw.done:
    case <-time.After(tw.timeout):
    }
}

测试代码如下:

func main() {
    const TIMEOUT = 5 * time.Second
    const TASK_EXECUTE_TIME = 3 * time.Second

    tw := NewWaitGroupTimeout(TIMEOUT)
    go func() {
        tw.Add(1)
        defer tw.Done()
        fmt.Println("start")
        time.Sleep(TASK_EXECUTE_TIME)
        fmt.Println("end")
    }()
    fmt.Println("wait exit")
    tw.Wait()
    fmt.Println("exit")
}

当超时时间大于任务时间时,任务可以正常完成然后退出,
当超时时间小于任务时间时,任务没有执行完成就退出了。

(转载本站文章请注明作者和出处:泞途 - ningto.com)

下一篇 – golang与qpid broker通信
上一篇 – 使用group by来统计每天产生的数据量

  1. Go

toningto@outlook.com

标签云

Life Android Javascript Python Windows Product Go Tools Java MQ Qt Node.js Tips Shell Design MongoDB Others Mac Mobile React C/C++ Web Boost Linux IOS Bug Database

推广链接

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

多谢支持,用了好几年,服务很稳定支持多设备!

其他

文章RSS

Copyright © 2016 Welcome To Ningto Blog | 鄂ICP备17003086号-2