GO并发编程综合应用

一.GO并发编程综合应用

1.生产者消费者模式
1.1需求分析

​ 生产者每秒生产一个商品,并通过物流公司取货

​ 物流公司将商品运输到商铺

​ 消费者阻塞等待商铺到货,需要消费10次商品

1.2实现原理

在这里插入图片描述

1.3代码实现:
package mainimport ("fmt""strconv""time"
)func main() {storageChan := make(chan Product, 10)shopChan := make(chan Product, 10)exitChan := make(chan bool, 1)for i := 1; i < 9; i++ {go Producer(storageChan, 10)}go Logistics(storageChan, shopChan)go Consumer(shopChan, 10, exitChan)if <-exitChan {return}
}// Product 商品
type Product struct {Name string
}// Producer 生产者
func Producer(storageChan chan<- Product, count int) {for {producer := Product{"商品:" + strconv.Itoa(count)}storageChan <- producercount--time.Sleep(time.Second)fmt.Println("生产了", producer)if count < 1 {return}}
}// Logistics 物流公司
func Logistics(storageChan <-chan Product, shopChan chan<- Product) {for {product := <-storageChanshopChan <- productfmt.Println("运输了", product)}
}// Consumer 消费者
func Consumer(shopChan <-chan Product, count int, exitChan chan<- bool) {for {product := <-shopChanfmt.Println("消费了", product)count--if count < 1 {exitChan <- truereturn}}
}
2.协程管道定时任务的应用
2.1需求分析

​ 1.定时执行某个任务,类似延时消息队列

​ 2.或者周期性的执行某个任务,类似定期同步某些数据

2.2实现原理

在这里插入图片描述

2.3代码实现:
package mainimport ("fmt""time"
)func main() {//方式1:fmt.Println("当前时间:", time.Now())//timer := time.NewTimer(time.Second * 3)//t := <-timer.C //timer.C一个只读的管道//fmt.Println(t)//方式二:t := <-time.After(time.Second * 3) //源码可见,实际上NewTimer(d).Cfmt.Println(t)
}
3.定时器的终止与重置

​ NewTimer, Stop, Reset

package mainimport ("fmt""math/rand""time"
)var flag bool = isStopTimer()func main() {//方式1:fmt.Println("当前时间:", time.Now())timer := time.NewTimer(time.Second * 3)if flag {timer.Stop() //如果停止了timer,还去拿fatal error: all goroutines are asleep - deadlock!} else {t := <-timer.C //timer.C一个只读的管道fmt.Println(t)}}func isStopTimer() bool {rand.Seed(time.Now().UnixNano())tempInt := rand.Intn(2) + 18if tempInt >= 18 {fmt.Println("已经找到了大于18,结束timer")return true} else {return false}
}func isResetTimer() int {rand.Seed(time.Now().UnixNano())tempInt := rand.Intn(4) + 19fmt.Println("已经找到",tempInt)return tempInt-18
}
4.需要每隔时间触发任务
4.1实现原理:

在这里插入图片描述

4.2代码实现
package mainimport ("fmt""time"
)func main() {var count int = 0ticker := time.NewTimer(time.Second * 1)go func() {for {t := <-ticker.Cfmt.Println("时间:", t.Format("2006-01-02 03:04:05PM"))count++if count > 2 {ticker.Stop()}}}()time.Sleep(time.Second * 10)fmt.Println("游戏结束")
}
4.3改造成任务队列
package mainimport ("fmt""sync""time"
)func main() {var count int = 0var wg sync.WaitGroupwg.Add(1)ticker := time.NewTicker(time.Second * 1)go func() {defer wg.Done()defer ticker.Stop()for {t := <-ticker.Cfmt.Println("时间:", t.Format("2006-01-02 03:04:05PM"))count++if count > 2 {return}}}()wg.Wait()fmt.Println("游戏结束")
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/224609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud微服务 【实用篇】| Docker启示录

目录 一&#xff1a;Docker启示录 1. Docker启示录 2. Docker和虚拟机的区别 3. Docker架构 4. Centos7安装Docker 4.1. 卸载 4.2. 安装docker 4.3. 启动docker 4.4. 配置镜像加速 前些天突然发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽…

Python之random模块详解

python的random模块 random模块是python中一个生成随机数的模块。 random不是python解释器内置的模块。 导入random模块的方法是&#xff1a; import random 如果只使用random模块中的单个方法的话&#xff0c;也可以使用 from random import method_name 例如&#xff1a; …

蓝牙协议栈学习笔记

蓝牙协议栈学习笔记 蓝牙简介 蓝牙工作在全球通用的 2.4GHz ISM&#xff08;即工业、科学、医学&#xff09;频段&#xff0c;使用 IEEE802.11 协议 蓝牙 4.0 是迄今为止第一个蓝牙综合协议规范&#xff0c;将三种规格集成在一起。其中最重要的变化就是 BLE&#xff08;Blue…

【数学建模】《实战数学建模:例题与讲解》第十三讲-相关分析(含Matlab代码)

【数学建模】《实战数学建模&#xff1a;例题与讲解》第十三讲-相关分析&#xff08;含Matlab代码&#xff09; 基本概念典型相关分析综合评价模型对应分析因子分析聚类分析 习题10.41. 题目要求2.解题过程3.程序 习题10.51. 题目要求2.解题过程3.程序 习题10.6&#xff08;1&a…

用Excel绘制柱形图

在需要将数据用柱状图表示的时候&#xff0c;可以用Excel进行绘制。不单绘制柱形图&#xff0c;其他数据图也可以用Excel绘制。 接下来用绘制一个销售表的示例演示。 1.将数据输入Excel 数学书 语文书 英语书 一月 80 94 77 二月 95 86 84 三月 130 93 79 四月 …

实用干货:再见ElementPlus,我有更好的了

大家好&#xff0c;我是大澈&#xff01; 本文约1200字&#xff0c;整篇阅读大约需要3分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试大礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff…

任务调度系统就该这么设计(万能通用),稳的一批!

今天来扒一扒轻量级的分布式任务调度平台Xxl-Job背后的架构原理 核心概念 这里还是老样子&#xff0c;为了保证文章的完整性和连贯性&#xff0c;方便那些没有使用过的小伙伴更加容易接受文章的内容&#xff0c;快速讲一讲Xxl-Job中的概念和使用 如果你已经使用过了&#xf…

在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)

背景 在项目过程中&#xff0c;有时候你需要调用非C#编写的DLL文件&#xff0c;尤其在使用一些第三方通讯组件的时候&#xff0c;通过C#来开发应用软件时&#xff0c;就需要利用DllImport特性进行方法调用。本篇文章将引导你快速理解这个调用的过程。 步骤 1. 创建一个CSharp…

Java 8特性:Lambda表达式、函数式接口与Stream API的深度探索

一、引言 随着编程范式的不断演变&#xff0c;Java语言也在不断地发展和创新。Java 8的发布&#xff0c;为开发者们带来了诸多全新的特性&#xff0c;其中包括Lambda表达式、函数式接口以及Stream API。这些特性使得Java语言的编程更加简洁、优雅&#xff0c;同时也提高了代码…

mybatis多表映射-对多关联

1、建库建表 create database mybatis-example; use mybatis-example; create table t_book (bid varchar(20) primary key,bname varchar(20),stuid varchar(20) ); insert into t_book values(b001,Java,s001); insert into t_book values(b002,Python,s002); insert into …

docker部署go gin框架 Windows环境

目录 文章目的是什么 环境介绍 Windows 环境下 docker 部署 go gin 详细步骤 运行容器时因为挂载文件可能会出现的问题 直接部署gin&#xff08;跳过运行容器时因为挂载文件可能会出现的问题&#xff09; 文章目的是什么 假设我们学习了 go 语言&#xff0c;在 Windows(本…

6.rk3588获取摄像头和激光雷达数据(用线程根据时间同步)

文件夹结构如下&#xff1a; 如果没有特殊说明&#xff0c;我们将py文件写在该路径里面。 保存数据的路径如下&#xff1a; ---img_lidar_save ---2023-12-13&#xff08;根据日期自动生成当天保存数据的文件夹) ---camera_data(相机数据文件夹&#xff09; ---image(保存相加…

[蓝桥杯刷题]合并区间、最长不连续子序列、最长不重复数组长度

前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录: 成功的关键在于对目标的持久追求。 ⭐个人主页&#xff1a;欧_aita ψ(._. )>⭐个人专栏&#xff1a; 数据结构与算法 数据库 文章目录 前言合并区间问题&#x1f4d5;现实应用大致思路代码实现代码讲解 最长不连续子序列&a…

jvisualvm手动安装VisualGC插件

前言 笔者近期排查问题需要查看GC的情况&#xff0c;于是用到了jvisualvm这个工具&#xff0c;查阅网上资料发现它有一个名为VisualGC的插件非常好用&#xff0c;于是笔者以此文记录一下VisualGC插件的安装步骤。 安装步骤 下载插件 首先我们要到官网 https://visualvm.gi…

未势能源受邀参加中国氢能100人论坛并发表演讲

12月12日-14日&#xff0c;“2023氢能嘉年华暨中国氢能100人论坛年会”在苏州举办&#xff0c;行业内专家学者、氢能头部企业代表等齐聚现场&#xff0c;聚焦氢能在化工、钢铁、交通等领域发展&#xff0c;共同探讨我国氢能产业初期前进之路。 未势能源液氢总工程师黄欢明受邀…

DevOps搭建(六)-安装Maven详细步骤

1、官网下载 下载地址&#xff1a; Maven – Download Apache Maven 2、上传压缩包到服务器 把下载好的压缩包上传到服务器上。 3、解压压缩包 解压压缩包到安装目录/usr/local/ tar -zxvf apache-maven-3.9.3-bin.tar.gz -C /usr/local/ 切换到/usr/local目录下ls命令看…

基于FPGA的视频接口之高速IO(光纤)

简介 对于高速IO口配置光纤,现在目前大部分开发板都有配置,且也有说明,在此根据自己的工作经验以及对于各开发板的说明归纳 通过高速IO接口,以及硬件配置,可以实现对于光纤的收发功能,由于GTX的速率在500Mbs到10Gbps之间,但通道高速io可配置光纤10G硬件,物理通完成,则…

SpringIOC之Jsr330ScopeMetadataResolver

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

科东软件Intewell操作系统:以“鸿”鹄之志,创未来之“道”

打造自主可控的新型工业操作系统是我国加速新型工业化进程&#xff0c;在新一轮科技革命中实现“换道超车”的重要契机。科东软件期待凭借鸿道Intewell新型工业操作系统的创新与应用&#xff0c;打造100%自主可控的工业网络和工业控制底层技术&#xff0c;为我国新型工业化贡献…

顶级Web应用程序测试工具列表

今天主要列举Web应用程序的工具。 今天的列表仅仅提供索引功能&#xff0c;具体要使用的同学&#xff0c;可以自行搜索哦。 通过web应用程序测试&#xff0c;在web应用程序公开发布之前&#xff0c;会发现网站功能、安全性、可访问性、可用性、兼容性和性能等问题。 Web应用程…