golang通知协程退出


/*
	一个安全关闭的的协程模型
*/
type MyChannel struct {
	C    chan struct{}
	once sync.Once
}

func NewMyChannel() *MyChannel {
	return &MyChannel{C: make(chan struct{})}
}

func (mc *MyChannel) SafeClose() {
	mc.once.Do(func() {
		close(mc.C)
	})
}

使用waitgroup和chanel是否关闭的判断来通知和等待协程退出

func main() {
	myChan := NewMyChannel()
	wg := &sync.WaitGroup{}
	wg.Add(1)
	go func() {
		for {
			select {
			case _,ok  := <-myChan.C:
				if !ok {
					fmt.Println("-> task out")
					wg.Done()
					return
				}
			default:
				fmt.Println("task ... ")
			}
			time.Sleep(time.Millisecond * 200)
		}
	}()

	time.Sleep(time.Second * 5)

	// 通知退出
	myChan.SafeClose()
	// 等待退出
	wg.Wait()
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM