删除文章

确定要删除这篇文章吗?

取消
确定

sync.WaitGroup增加timeout

     阅读(55)  2020-04-29 07:52:02

要等待多个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")
}

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

文章评论

Keep it simple,stupid
文章数
329
今日访问
2437
今日IP数
208
最近评论

liangzi: 不错 谢谢分享
tujiaw: registerThreadInactive:如果当前没有激活的线程,就去激活线程,让等待的线程去执行任务。
hgzzx: 佩服佩服。 请教:registerThreadInactive的作用是什么?
xuehaoyun: 很不错,来围观一下
tujiaw: 抱歉csdn code服务关闭了,这个代码我也找不到了
于淞: 你好,这个文章的源码能分享一下吗,songsong9181@163.com,谢谢了 上面的写错了
回到顶部