GoLang并发简单例子(goroutine + channel + WaitGroup)

文章目录

go 复制代码
package main

import (
	"fmt"
	"sync"
)

// 帮忙统计有多少个 goroutine 需要等待,以及什么时候它们都结束了。
var wg sync.WaitGroup

func printer(ch chan int) {
	for i := range ch {
		fmt.Printf("Received %d ", i)
	}
	// wg.Done() 表示:这个 goroutine 已经执行完它的任务了。	
	// 内部等价于 wg.Add(-1):
	// 把 WaitGroup 的计数减 1。	
	// 当计数变成 0 时,任何 wg.Wait() 正在阻塞的 goroutine 都会被唤醒
	wg.Done()
}

// main is the entry point for the program.
func main() {
	// 创建了一个 无缓冲(unbuffered) 的 channel,类型为 chan int。
	// 无缓冲的意思是:
	// 发送 c <- i 会阻塞,直到有另外一个 goroutine 正在从 c 读数据;
	// 接收 <-c 也会阻塞,直到有别人发送。
	c := make(chan int)

	// "我有 1 个 goroutine 要等"。
	wg.Add(1)

	go printer(c)

	// Send 10 integers on the channel.
	// 阻塞行为:因为 c 是一个无缓冲通道,所以每次主函数发送数据时,都会被阻塞,直到有另一个 goroutine 从该通道中接收数据。如果没有 goroutine 在接收通道中的数据,主 goroutine 会停在那里,等待 printer goroutine 来接收数据。
	for i := 1; i <= 10; i++ {
		c <- i
	}

	close(c)
	wg.Wait()
	fmt.Println()
}

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

相关推荐
小陈phd19 分钟前
深入理解agent学习笔记(六)——提示工程-优化系统提示词
笔记·学习
高频因子挖掘机20 分钟前
股票分红送转后价格“断层”:前复权、后复权和不复权该怎么选?
后端·github·api
一条泥憨鱼21 分钟前
【Redis | 黑马点评】短信登录功能 源码深度分析
java·redis·后端·session·黑马点评
威哥爱编程25 分钟前
【AI全栈12-12】Spring Boot 3.x → 4.x 迁移实操:Jakarta 11、Jackson 3 与 AI 2.0
java·spring boot·后端
微笑星河q29 分钟前
C++类和对象(下)初始化列表、类型转换、static、友元、内部类、匿名对象
开发语言·c++
威哥爱编程30 分钟前
【AI全栈12-11】Spring Boot 把 AI 接口真正上线扛量:限流 / 降级 / 可观测
java·spring boot·后端
小蒜学长31 分钟前
基于SpringBoot+uni-app的闪洁家政系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·uni-app·家政服务
凤年徐32 分钟前
【Python】Python 语法速通指南
开发语言·python
quantdash_cc36 分钟前
量化数据清洗应该放在数据层还是策略层?从系统架构看清职责边界
开发语言·python·数据分析·系统架构·量化交易·股票数据·quantdash
|_⊙1 小时前
C++ 类和对象零散知识点
开发语言·c++