一个协程向其它协程发送通知

package main

import (
	"fmt"
	"time"
)

func main() {
	N := 10
	exit := make(chan struct{})
	done := make(chan struct{}, 10)

	for i := 0; i < N; i++ {
		go func(n int) {
			for {
				select {
				// 每个协程都在等待exit信号
				case <-exit:
					fmt.Printf("worker goroutine # %d exit\n", n)
					// 收到exit信号后, 往done中写入数据
					done <- struct{}{}
					return

					// 每秒都会发生
				case <-time.After(time.Second):
					fmt.Printf("worker goroutine # %d is working...\n", n)

				}
			}
		}(i)
	}

	// 主协程等待10s
	time.Sleep(3 * time.Second)

	// 主协程发送exit信号,这样每个goroutine都会收到exit信号
	close(exit)

	for i := 0; i < N; i++ {
		<-done
	}

	fmt.Println("main goroutine exit")
}

/*
worker goroutine # 4 is working...
worker goroutine # 2 is working...
worker goroutine # 5 is working...
worker goroutine # 8 is working...
worker goroutine # 0 is working...
worker goroutine # 7 is working...
worker goroutine # 1 is working...
worker goroutine # 9 is working...
worker goroutine # 6 is working...
worker goroutine # 3 is working...
worker goroutine # 8 is working...
worker goroutine # 2 is working...
worker goroutine # 4 is working...
worker goroutine # 5 is working...
worker goroutine # 6 is working...
worker goroutine # 7 is working...
worker goroutine # 0 is working...
worker goroutine # 3 is working...
worker goroutine # 9 is working...
worker goroutine # 1 is working...
worker goroutine # 8 exit
worker goroutine # 3 exit
worker goroutine # 6 exit
worker goroutine # 5 exit
worker goroutine # 7 exit
worker goroutine # 1 exit
worker goroutine # 0 exit
worker goroutine # 9 exit
worker goroutine # 2 exit
worker goroutine # 4 exit
main goroutine exit
*/

猜你喜欢

转载自blog.csdn.net/themagickeyjianan/article/details/106981761
今日推荐