3. 如何控制协程执行顺序

此开源图书由ithaiqarrow-up-right原创,创作不易转载请注明出处

对应两个协程勿扰质疑可以通过两个channel先后触发即可,还可以交替执行

如交替打印数字和字母,实现如下效果:12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ

func main() {
	wg := &sync.WaitGroup{}
	numChan := make(chan struct{}, 1)
	byteChan := make(chan struct{}, 1)
	wg.Add(2)
	numChan <- struct{}{}
	go numPrint(wg, numChan, byteChan)
	go bytePrint(wg, numChan, byteChan)
	wg.Wait()
}

func numPrint(wg *sync.WaitGroup, numChan, byteChan chan struct{}) {
	i := 1
	for {
		if i == 27 {
			wg.Done()
			break
		}
		<-numChan
		println(i, i+1)
		i += 2
		byteChan <- struct{}{}
	}
}

func bytePrint(wg *sync.WaitGroup, numChan, byteChan chan struct{}) {
	i := 'A'
	for {
		if i > 'Z' {
			wg.Done()
			break
		}
		<-byteChan
		fmt.Printf("%c%c", i, i+1)
		i += 2
		numChan <- struct{}{}
	}
}

延伸开来,如果N个协程如何控制执行顺序?考虑使用sync.Cond

如上代码演示主要是Broadcast广播任意goroutine都能收到Wait解除阻塞,然后通过互斥锁mutex控制全局变量group,而group再去控制执行顺序

最后更新于