当前位置: 首页 > article >正文

go语言两个协程goroutine交替打印1-100

go语言两个协程goroutine交替打印1-100

该程序使用了 sync.WaitGroup 来协调两个 goroutine 的执行。
首先创建了两个无缓冲的通道 ch1 和 ch2 ,并将 WaitGroup 的计数器设置为 2,表示需要等待两个 goroutine 完成。
第一个 goroutine 从 1 开始,每次加 2 生成奇数,将奇数发送到 ch1 并打印,然后等待从 ch2 接收数据,接收数据后继续下一次迭代,当完成 1 到 100 的奇数发送后,关闭 ch1 通道。
第二个 goroutine 从 ch1 中接收数据,打印接收到的数据加 1 的结果,并将接收到的数据发送到 ch2 ,当 ch1 关闭且数据全部接收完后,关闭 ch2 通道。
wg.Wait() 会阻塞主函数,直到两个 goroutine 都调用 wg.Done() 通知 WaitGroup 完成。
在这里插入图片描述

Start
Create WaitGroup
Create channels ch1 and ch2
Add 2 to WaitGroup counter
Start Goroutine 1
Start Goroutine 2
Wait for Goroutines to finish
End
Send odd numbers to ch1
Print odd numbers
Wait for data from ch2
Close ch1
Receive data from ch1
Print received data + 1
Send data to ch2
Close ch2
package main

import (
	"fmt"
	"sync"
)

func main() {
	// 创建一个 WaitGroup 用于等待多个 goroutine 完成
	var wg sync.WaitGroup
	// 创建一个无缓冲的整数通道 ch1
	ch1 := make(chan int)
	// 创建一个无缓冲的整数通道 ch2
	ch2 := make(chan int)

	// 向 WaitGroup 中添加 2 个需要等待的 goroutine
	wg.Add(2)

	// 启动第一个 goroutine
	go func() {
		// 当 goroutine 结束时,调用 Done 通知 WaitGroup 完成
		defer wg.Done()
		// 从 1 开始,每次加 2 向 ch1 发送奇数
		for i := 1; i <= 100; i += 2 {
			ch1 <- i
			// 打印发送的奇数
			fmt.Println("Goroutine 1:", i)
			// 等待 ch2 发送数据
			<-ch2
		}
		// 关闭 ch1 通道
		close(ch1)
	}()

	// 启动第二个 goroutine
	go func() {
		// 当 goroutine 结束时,调用 Done 通知 WaitGroup 完成
		defer wg.Done()
		// 从 ch1 中接收数据
		for i := range ch1 {
			// 打印接收的奇数加 1 的结果
			fmt.Println("Goroutine 2:", i+1)
			// 向 ch2 发送数据
			ch2 <- i
		}
		// 关闭 ch2 通道
		close(ch2)
	}()

	// 等待两个 goroutine 完成
	wg.Wait()
}


http://www.kler.cn/a/512683.html

相关文章:

  • iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析
  • 【Python】循环语句
  • (一)相机标定——四大坐标系的介绍、对应转换、畸变原理以及OpenCV完整代码实战(C++版)
  • STM32之CubeMX图形化工具开发介绍(十七)
  • 点云目标检测训练数据预处理---平面拟合与坐标转换(python实现)
  • 美区TikTok解封后如何回归使用?
  • 解决用 rm 报bash: /usr/bin/rm: Argument list too long错
  • Javascript 将页面缓存存储到 IndexedDB
  • BH1750使用程序
  • 基于SpringBoot和PostGIS的各国及所属机场信息检索及可视化实现
  • Debian常用命令
  • C 语言雏启:擘画代码乾坤,谛观编程奥宇之初瞰
  • Linux之网络套接字
  • C语言/C++——递归、递推、动态规划
  • 各语言镜像配置汇总
  • Unity中用触发器模拟碰撞效果
  • 为什么相关性不是因果关系?人工智能中的因果推理探秘
  • 【深度学习】利用Java DL4J 训练金融投资组合模型
  • 【漫话机器学习系列】056.F1值(F1 score)
  • 前端——JS
  • STM32 FreeRTOS任务通知
  • C++设计新思维:泛型编程与设计模式之应用学习笔记
  • WebSocket 和 Socket 的区别
  • 谈一谈前端构建工具的本地代理配置(Webpack与Vite)
  • 开发常用工具
  • QT:IconButton的动画效果