【Go语言入门学习笔记】Part19.速率控制、原子计数器、互斥锁(Mutex)、状态协程
一、前言一些关于并发操作的组件。二、学习代码速率控制package main import ( fmt time ) func main() { request : make(chan int, 5) //模拟到来五个请求 for i : 0; i 5; i { request - i * 5 } close(request) //到来五个请求后停止接收请求 limiter : time.Tick(time.Second / 5) // 200ms每次接收 //Tick底层实现就是NewTicker返回一个channel每隔200ms向channel中放入一个时间相当于无缓冲 for req : range request { -limiter //每次先等待limiter的时间间隔 fmt.Println(request:, req, time.Now()) } //突发 brustLimiter : make(chan time.Time, 3) //模拟突发请求实则为有缓冲的通道,突发计时器 for i : 0; i 3; i { //注入三个时间到brust中 brustLimiter - time.Now() } go func() { //理解为计时器协程每200ms往brustLimiter中放入一个时间保证每200ms可以处理一个请求 for t : range time.Tick(time.Second / 5) { //fmt.Println(brust time:, t, time.Now()) brustLimiter - t //每200ms向brust中放入一个时间 } }() time.Sleep(50 * time.Millisecond) //主线程睡眠50ms保证子线程有足够的时间执行 BrustRequest : make(chan int, 5) //模拟到来五个请求 for i : 0; i 5; i { BrustRequest - i * 3 } close(BrustRequest) //到来五个请求后停止接收请求 for req : range BrustRequest { -brustLimiter //每次先等待brustLimiter的时间间隔 fmt.Println(brust request:, req, time.Now()) } }原子计数器package main import ( fmt sync sync/atomic ) func main() { var count uint64 0 var wg sync.WaitGroup for i : 0; i 10; i { wg.Add(1) atomic.AddUint64(count, 1) //原子操作加1 if i 5 { fmt.Println(atomic.LoadUint64(count)) //原子操作读取count的值 } wg.Done() } wg.Wait() fmt.Println(Final count:, count) atomic.StoreUint64(count, 520) //原子操作存储count的值即赋值 }互斥锁package main import ( fmt sync ) type Container struct { mu sync.Mutex //互斥锁在一个时间段里只能有一个线程访问 counter map[string]int } func (c *Container) Increment(key string) { c.mu.Lock() defer c.mu.Unlock() c.counter[key] } func (c *Container) Get(key string) int { c.mu.Lock() defer c.mu.Unlock() return c.counter[key] } func main() { c : Container{ //互斥变量默认为可用 counter: map[string]int{key1: 0, key2: 0}, } var wg sync.WaitGroup doInc : func(key string, times int) { defer wg.Done() for i : 0; i times; i { c.Increment(key) } } wg.Add(2) go doInc(key1, 1000) go doInc(key2, 1000) wg.Wait() fmt.Println(Final counts:, c.Get(key1), c.Get(key2)) }状态协程package main import ( fmt sync ) // 状态协程对信息的操作全部封装在一个协程里有需求就向状态协程里发送消息状态协程收到消息后进行处理处理完后再返回结果给调用方 const ( Add iota //默认为0 Sub //1 Get //2 ) type Msg struct { Op int //即前面const定义的操作类型 Value int Resp chan string //用于返回结果的通道 } func Operation(balance *int, msg -chan Msg, done -chan struct{}, wg *sync.WaitGroup) { defer fmt.Println(Operation goroutine exit) defer wg.Done() for { select { case -done: return case cmd : -msg: switch cmd.Op { case Add: *balance cmd.Value cmd.Resp - Add Success case Sub: *balance - cmd.Value cmd.Resp - Sub Success case Get: cmd.Resp - fmt.Sprintf(Balance is %d, *balance) } } } } func main() { balance : 0 msg : make(chan Msg) done : make(chan struct{}) var wg sync.WaitGroup wg.Add(1) go Operation(balance, msg, done, wg) //发送加钱的消息 resp : make(chan string) msg - Msg{Op: Add, Value: 100, Resp: resp} fmt.Println(-resp) //发送减钱的消息 msg - Msg{Op: Sub, Value: 50, Resp: resp} fmt.Println(-resp) msg - Msg{Op: Get, Resp: resp} fmt.Println(-resp) // workGroup var workGroup sync.WaitGroup for i : 0; i 10; i { workGroup.Add(1) go func(i int) { defer workGroup.Done() myResp : make(chan string) msg - Msg{Op: Get, Resp: myResp} fmt.Println(-myResp, i) }(i) } workGroup.Wait() //等待所有的需求操作的协程执行完毕 close(done) //这个Done是相对优雅的退出信号 wg.Wait() }

相关新闻

2026年来内蒙游玩必吃的特色名鸡,到底选哪家才正宗好吃不踩雷

2026年来内蒙游玩必吃的特色名鸡,到底选哪家才正宗好吃不踩雷

今年内蒙旅游的热度持续走高,我身边不下10个朋友端午去乌兰察布看火山、逛草原,回来一半都吐槽:想买点当地最有名的卓资山熏鸡当伴手礼,要么买的没有烟熏味,要么咸得没法下嘴,怀疑自己买了假货。作为吃了十…

2026/7/30 5:58:32 阅读更多 →
携程被罚51.79亿,OTA告别“独家时代”

携程被罚51.79亿,OTA告别“独家时代”

“中国版Booking”的故事,该重写了。文|段泽钰编|郭梦仪中国在线旅游行业的反垄断第一案,终于尘埃落定。2026年7月25日,市场监管总局对携程滥用市场支配地位作出行政处罚,罚没款合计51.79亿元。7.5%的罚款比…

2026/7/30 5:58:31 阅读更多 →
老板IP个性化人设塑造实操思路 落地性干货分享

老板IP个性化人设塑造实操思路 落地性干货分享

短视频流量持续深耕的当下,越来越多企业老板开始重视个人IP的打造,认可其对于品牌曝光、客户信任积累、业绩转化的重要价值。但从实际落地情况来看,能够打造出有辨识度、有个性化人设,且能稳定实现业绩转化的老板账号并不多。 不少…

2026/7/30 5:57:31 阅读更多 →

最新新闻

终极炉石传说优化插件:55个功能全面升级你的游戏体验

终极炉石传说优化插件:55个功能全面升级你的游戏体验

终极炉石传说优化插件:55个功能全面升级你的游戏体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 你是否厌倦了炉石传说中漫长的等待时间?是否想要个性化你的英雄…

2026/7/30 6:07:35 阅读更多 →
STM32 USB复合设备协议栈设计:从HID键盘到CDC串口的轻松实现

STM32 USB复合设备协议栈设计:从HID键盘到CDC串口的轻松实现

1. 项目概述:为什么我们需要一个“轻松”的USB协议栈?搞过STM32 USB开发的朋友,估计都有一段“刻骨铭心”的经历。官方HAL库的USB例程,功能是强大,但那个复杂度,简直让人望而生畏。光是理解那一堆回调函数、…

2026/7/30 6:07:35 阅读更多 →
STM32标准库PWM呼吸灯实战:从定时器配置到占空比动态控制

STM32标准库PWM呼吸灯实战:从定时器配置到占空比动态控制

1. 项目概述:从闪烁到呼吸,PWM的魅力玩过单片机的人,第一个程序大概率是点亮一个LED,让它闪烁。这就像单片机的“Hello World”。但很快,你就会觉得这种简单的亮灭有些单调。有没有办法让LED像生命一样,平缓…

2026/7/30 6:07:35 阅读更多 →
四轮独立驱动智能车协同控制:从运动学解算到底层PID调参实战

四轮独立驱动智能车协同控制:从运动学解算到底层PID调参实战

1. 项目概述:从“能动”到“会动”的跨越搞智能车,尤其是自己做四轮独立驱动的,最头疼的往往不是让轮子转起来,而是让四个轮子“听话”地协同工作。你可能已经用Arduino或者STM32让四个电机都转起来了,但车子一走起来就…

2026/7/30 6:07:35 阅读更多 →
2026年AIGC检测工具实测与技术解析

2026年AIGC检测工具实测与技术解析

1. 项目概述:AIGC检测工具全景实测2026年的AIGC内容检测领域已经发生了翻天覆地的变化。作为一名长期跟踪AI生成内容检测的技术从业者,我耗时三个月对市面上主流的15款检测工具进行了全面实测。这次测试覆盖了文本、代码、图像等多模态内容的检测需求&am…

2026/7/30 6:07:35 阅读更多 →
终极AI视频生成解决方案:5分钟掌握MoneyPrinterTurbo全流程

终极AI视频生成解决方案:5分钟掌握MoneyPrinterTurbo全流程

终极AI视频生成解决方案:5分钟掌握MoneyPrinterTurbo全流程 【免费下载链接】MoneyPrinterTurbo 利用 AI 大模型和自动化工作流,根据主题或关键词一键生成高清短视频。Generate HD short videos from a topic or keyword with an automated AI workflow.…

2026/7/30 6:06:35 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻