Golang笔记

Golang sync.WaitGroup 的 Wait 超时处理

sync.WaitGroup 使用 Add(1)Done()Wait()组合来实现多协程等待,如果某一协程未能合理处理错误,导致无法退出,此时需要引入超时机制。下面是一种超时处理方法。

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	wg := sync.WaitGroup{}
	wg.Add(1)

	done := make(chan struct{})

	go func() {
		wg.Wait()
		done <- struct{}{}
	}()

	go func() {
		time.Sleep(5 * time.Second)
		wg.Done()
	}()

	timeout := time.Duration(10) * time.Second
	fmt.Printf("Wait for waitgroup (up to %s)\n", timeout)

	select {
	case <-done:
		fmt.Printf("Wait group finished\n")
	case <-time.After(timeout):
		fmt.Printf("Timed out waiting for wait group\n")
	}

	fmt.Printf("Free at last\n")
}

未超时,输出:

Wait for waitgroup (up to 10s)
Wait group finished
Free at last

修改 Sleep 时间

	go func() {
		time.Sleep(15 * time.Second)
		wg.Done()
	}()

超时输出:

Wait for waitgroup (up to 10s)
Timed out waiting for wait group
Free at last
本文网址: https://golangnote.com/topic/259.html (转载注明出处)
关于GolangNote:记录在工作中使用golang 遇到、面临的相关问题及解决方法。如果你在这里获得一些知识或信息,解决你的编程问题,请考虑捐赠给不幸的人或者你喜欢的慈善机构,除捐赠外,种植树木、志愿服务或减少排碳的行为也很有益处。如果你有任何问题可以在下面 留言
Be the first to comment!
Captcha image
Relative Articles