首页 > 其他分享 >两个协程交替打印

两个协程交替打印

时间:2022-09-25 23:56:09浏览次数:48  
标签:wg 协程 打印 交替 func channel 通道

两个协程交替打印

两个channel

思路: 使用两个通道,一个协程从自己的通道中取出数,然后向对方的通道中放一个数

代码:

// 两个协程
func printA(c1, c2 chan int, wg *sync.WaitGroup) {
	defer wg.Done()
	for i := 0; i <= 100; i++ {
		<-c1
		if i%2 == 0 {
			fmt.Println("goroutine A is printing:", i)
		}
		c2 <- 100
	}
}
func printB(c1, c2 chan int, wg *sync.WaitGroup) {
	defer wg.Done()
	for i := 0; i <= 100; i++ {
		<-c2
		if i%2 == 1 {
			fmt.Println("goroutine B is printing:", i)
		}
		c1 <- 100
	}
}

func Method1() {
	wg := &sync.WaitGroup{}
	c1 := make(chan int,1) // 要加缓冲区,不然死锁
	c2 := make(chan int,1)

	wg.Add(2)
	go printA(c1, c2, wg)
	go printB(c1, c2, wg)
	c1<-1 // 启动打印
	wg.Wait()
}

一个channel

思路: 用一个通道,一个协程去取数,一个往通道里放数,达到交替效果

但是这种方法有问题,就是一存一取的情况下,两个协程其实是同时可以继续向下运行的,这里是靠判断 i 的奇偶错开了他们。

代码:

// 这种使用channel的方法其实是有问题的,因为对于无缓冲的channel,一边进了之后,另一边的出会同时满足,所以如果去掉奇偶判断,就会出现错误的结果。
var ChanSignal = make(chan int)

var wg = sync.WaitGroup{}

func Method2() {
	wg.Add(2)
	go printAA()
	go printBB()
	wg.Wait()
}

func printAA() {
	defer wg.Done()
	for i := 0; i < 101; i++ {
		ChanSignal <- 1

		if i%2 == 1 {
			fmt.Println("AAAA:", i)
		}
	}
}

func printBB() {
	defer wg.Done()
	for i := 0; i < 101; i++ {
		<-ChanSignal

		if i%2 == 0 {
			fmt.Println("BBBB:", i)
		}
	}

}

标签:wg,协程,打印,交替,func,channel,通道
From: https://www.cnblogs.com/yumingkuan/p/16729447.html

相关文章

  • 使用Python实现读取TXT小说文件按每一回显示打印出来
    大家好,我是皮皮。一、前言前几天在Python铂金交流群【红色基因代代传】问了一个Python处理的问题,提问截图如下:文件里边的部分截图如下:大概的需求如下所示:二、实现......
  • 打印九九乘法表,打印金字塔-java
    /***********打印如图金字塔*=i*2-1(竖)空格数=列数-1*/publicclassCirculate{ publicstaticvoidmain(String[]args){ intcount=3; for(inti=......
  • 打印菱形-java
    publicclassWeekendDemo01{/** 打印菱形************* ******/ publicstaticvoidmain(String[]args){ intbianchang;//记录边长......
  • 怎么在手机上打印文件?手机文件打印小妙招
    相信有不少上班族都遇到过这样的情况,这就是领导或同事通过手机微信发送了不少电子版文件给你,而你又需要把这些文件打印出来使用,这时候你会怎么办呢?有的网友表示,自己回去周......
  • golang goroutine协程泄露
      语言级别的并发支持是Go的一大优势,但这个优势也很容易被滥用。通常我们在开始Go并发学习时,常常听别人说,Go的并发非常简单,在调用函数前加上go关键词便可启动g......
  • 线上自助打印小程序有哪些?
    如果你有不少资料或文件需要打印,那么你会选择怎么样的打印方式呢?是找遍周边的大大小小打印店,然后货比三家,选择一个价格优惠的打印店进行打印?还是直接在网上找到一个实惠又......
  • 模板分文件编写,CUDA打印
    ifndefFUN_HPPdefineFUN_HPPifdefined(USE_EXPORT)defineEXPORTexportelsedefineEXPORTendifEXPORTtemplatevoidprint_typeof(Tconst&);if!defined(US......
  • 线上自助打印!学习资料随便打印
    对于不少中小学的学生家长,或者在备考研究生、公务员、事业编等考试的考生来说,打印学习资料是必不可少的。不过有不少需要经常打印各种学习资料的网友表示,在路边的打印店打......
  • 佳能Canon打印机G3800出现5B00错误代码提示,处理办法,G2800出现5B00废墨清零G1800出现5B
    使用佳能打印机时,经常会出现打印机错误,错误号码:5B00。出现这个错误的原因是打印机的废墨垫使用寿命已经达到了,系统芯片记录海绵吸收废墨计数达到临界值,所以会提示5B00的警......
  • 【Springboot之搜索日志妙招】在日志上打印请求唯一log标识
    在每次请求中打出的每条日志中添加统一的请求唯一标识。通过搜索日志唯一标识,这样就可以非常高效精准排查问题;例如:2018-12-2110:21:26.329[http-nio-8080-exec-2][......