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