go里面几个并发案例

1、用golang 写一个 消息队列,通过channel 多协程实现,一个写队列多个读队列

type MessageQueue struct {mu      sync.Mutexqueue   chan stringreaders []chan string
}func NewMessageQueue() *MessageQueue {return &MessageQueue{queue:   make(chan string, 10), // Buffer size 10, adjust as neededreaders: make([]chan string, 0),}
}func (mq *MessageQueue) AddReader(readerChan chan string) {mq.mu.Lock()defer mq.mu.Unlock()mq.readers = append(mq.readers, readerChan)
}func (mq *MessageQueue) Write(message string) {mq.queue <- message
}func (mq *MessageQueue) StartReaders() {for _, readerChan := range mq.readers {go func(ch chan string) {for {message, ok := <-chif !ok {break}fmt.Println("Received:", message)}}(readerChan)}
}func main() {messageQueue := NewMessageQueue()// 启动多个 reader goroutinefor i := 0; i < 3; i++ {readerChan := make(chan string, 10) // 缓冲区大小10,根据需要调整messageQueue.AddReader(readerChan)}// 启动 reader goroutinemessageQueue.StartReaders()// 将消息写入队列for i := 1; i <= 5; i++ {messageQueue.Write(fmt.Sprintf("Message %d", i))time.Sleep(time.Second)}// 完成后关闭读者通道messageQueue.mu.Lock()for _, readerChan := range messageQueue.readers {close(readerChan)}messageQueue.mu.Unlock()// 留出时间让 reader goroutine 完成处理time.Sleep(time.Second)
}

2、用golang 写一个 消息队列,通过channel 多协程实现,多个写队列多个读队列

package mainimport ("fmt""sync"
)type MessageQueue1 struct {mu    sync.Mutexqueue []string
}func NewMessageQueue1() *MessageQueue1 {return &MessageQueue1{queue: make([]string, 0),}
}func (mq *MessageQueue1) Write(message string) {mq.mu.Lock()defer mq.mu.Unlock()mq.queue = append(mq.queue, message)
}func (mq *MessageQueue1) Read() (string, bool) {mq.mu.Lock()defer mq.mu.Unlock()if len(mq.queue) > 0 {message := mq.queue[0]mq.queue = mq.queue[1:]return message, true}return "", false
}func main() {messageQueue1 := NewMessageQueue1()var wg sync.WaitGroupdone := make(chan struct{})// 启动多个写协程for i := 1; i <= 8; i++ {wg.Add(1)go func(id int) {defer wg.Done()for j := 1; j <= 5; j++ {message := fmt.Sprintf("-- Writer %d: Message %d", id, j)messageQueue1.Write(message)//time.Sleep(time.Millisecond * 1)}}(i)}// 启动多个读协程for i := 0; i <= 7; i++ {wg.Add(1)go func(id int) {defer wg.Done()for {message, ok := messageQueue1.Read()if !ok {break}fmt.Printf("Reader %d received: %s\n", id, message)}}(i)}// 等待所有协程完成go func() {wg.Wait()close(done)}()// 等待所有协程完成后结束程序<-done
}

3、并发安全的全局计数器编写一个 Go 程序,实现一个并发安全的全局计数器,要求能够支持并发的增加和获取计数。请使用互斥锁或其他并发安全的机制,确保多个 goroutine同时访问时不会出现竞态条件。

type Counter struct {Count intmx    sync.Mutex
}func (c Counter) InCream() {c.mx.Lock()defer c.mx.Unlock()c.Count++
}func (c Counter) CountNumber() int {c.mx.Lock() //并发安全defer c.mx.Unlock()return c.Count
}func main() {count := Counter{}var wg sync.WaitGroupfor i := 0; i < 100; i++ { //并发的增加wg.Add(1)go func() {count.InCream()wg.Done()}()}wg.Wait()for i := 0; i < 20; i++ {go func(i int) {fmt.Printf("Count %v,%v \n", i, count.CountNumber())}(i)}time.Sleep(1 * time.Second)}

4、并发安全的缓存
实现一个带有过期时间的并发安全的缓存系统。
缓存应该支持设置键值对、获取键值对和定期清理过期的键值对。使用互斥锁或其他并发安全的机制确保多个 goroutine 同时访问时不会出现竟态条件。

package mainimport (
"sync"
"time"
)// CacheItem 表示缓存中的一个键值对
type CacheItem struct {Value      interface{}Expiration int64 // 过期时间戳,单位秒
}// ConcurrentCache 表示并发安全的缓存系统
type ConcurrentCache struct {cache map[string]CacheItemmutex sync.Mutex
}// NewConcurrentCache 创建一个新的并发安全的缓存系统
func NewConcurrentCache() *ConcurrentCache {return &ConcurrentCache{cache: make(map[string]CacheItem),}
}// Set 设置缓存中的键值对,并指定过期时间(秒)
func (c *ConcurrentCache) Set(key string, value interface{}, expirationSeconds int64) {c.mutex.Lock()defer c.mutex.Unlock()expirationTime := time.Now().Unix() + expirationSecondsc.cache[key] = CacheItem{Value:      value,Expiration: expirationTime,}
}// Get 获取缓存中指定键的值,如果键不存在或已过期则返回nil
func (c *ConcurrentCache) Get(key string) interface{} {c.mutex.Lock()defer c.mutex.Unlock()item, exists := c.cache[key]if !exists || time.Now().Unix() > item.Expiration {// 键不存在或已过期return nil}return item.Value
}// CleanExpired 清理过期的键值对
func (c *ConcurrentCache) CleanExpired() {c.mutex.Lock()defer c.mutex.Unlock()currentTime := time.Now().Unix()for key, item := range c.cache {if currentTime > item.Expiration {delete(c.cache, key)}}
}func main() {// 示例用法cache := NewConcurrentCache()// 设置键值对,并指定过期时间为10秒cache.Set("key1", "value1", 10)// 获取键值对result := cache.Get("key1")if result != nil {println(result.(string))} else {println("Key not found or expired.")}// 定期清理过期的键值对cache.CleanExpired()
}

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

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

相关文章

高速CAN总线 A C节点竞争总线时 电压分析(共ABC三个节点)

CAN 收发器放大图 ABC三节点框图如下图&#xff1a; 图① 简化过程同<<高速CAN总线 A节点发送 B节点接收 电压分析>> A C节点同时发送显性电平 如下图: 图② A C 节点同时发送显性电平, 则 4 个三极管全部导通, 假定三极管压降0.5V 则电路简化如下图.(导通分析参…

AI日报:扎克伯格瞄准AGI通用人工智能

文章目录 Meta瞄准通用人工智能领域Meta的目标Meta的产品 FAIR移动和装载H100扎克伯格对人工智能竞争对手的真实动机持怀疑态度Meta抛弃了元宇宙吗&#xff1f; Meta瞄准通用人工智能领域 Meta首席执行官马克扎克伯格&#xff08;Mark Zuckerberg&#xff09;在一份可能改变全…

抽象类和抽象方法

抽象方法&#xff1a;将共性的行为&#xff08;方法&#xff09;抽取到父类之后。由于每一个子类执行的内容是不一样&#xff0c;所以&#xff0c;在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。 抽象类&#xff1a;如果一个类中存在抽象方法&#xff0c;那么该类…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于混合博弈的配电网与多综合能源微网优化运行》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题涉及到配电网和多综合能源微网的优化运行&#xff0c;而优化的方法基于混合博弈理论。让我们逐步解读这个标题的关键部分&#xff1a; 基于混合…

mariadb数据库从入门到精通

mariadb数据库的安装以及安全初始化 mariadb数据库的安装以及安全初始化 mariadb数据库的安装以及安全初始化一、实验前提二、mariadb数据库的安装三、mariadb数据库安全初始化3.1 设定数据库基本的安全初始化3.2关闭对外开放端口 系列文章目录一、查看数据库二、进入库并且查看…

leetcode下一个更大的元素---1暴力---2单调栈

1.题目&#xff1a; nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 &#xff0c;下标从 0 开始计数&#xff0c;其中nums1 是 nums2 的子集。 对于每个 0 < i < nums1.l…

【Element UI详细介绍】

Element UI详细介绍 1. Element UI1.1 VueElementUI安装1.2 开发示例 2. 特点3. 组件分类4. 开始使用5. 注意事项 1. Element UI Element UI 是一个基于 Vue 2.0 的桌面端组件库&#xff0c;主要用于构建快速、简洁的用户界面&#xff0c;Element UI 提供一套丰富的组件和工具…

Java进阶之旅第五天

Java进阶之旅第五天 不可变集合 应用场景 1.如果某个数据不能被修改,把它拷贝到不可变集合中是个很好的实践2.当集合对象被不可信的库调用时,不可变形式是安全的3.不可变集合不能修改,只能进行查询 获取方式 在List,Set,Map接口中,都存在静态的of方法,可以获取一个不可变的…

蓝桥杯、编程考级、NOC、全国青少年信息素养大赛—scratch列表考点

1、小小情报员&#xff08;202309scratch四级24题&#xff09; 1.准备工作 &#xff08;1&#xff09;选择背景 Colorful City&#xff1b; &#xff08;2&#xff09;保留角色小猫&#xff0c;选择角色Ballerina。 2.功能实现 &#xff08;1&#xff09;角色小猫初始位置…

leetcode-2788按分隔符拆分字符串

题目链接 2788. 按分隔符拆分字符串 - 力扣&#xff08;LeetCode&#xff09; 解题思路 class Solution:def splitWordsBySeparator(self, words: List[str], separator: str) -> List[str]:result []for i in words:for j in i.split(separator):if j:result.append(j)…

C语言中的变量与scanf介绍(干货)

目录 前言 一、变量 1. 变量的创建 2. 变量的分类 3. 强制类型转换 二、scanf介绍 1. scanf的基本用法 2. scanf的返回值 3. scanf的占位符 4. 赋值忽略符 结语&#xff1a; 前言 我们在前面的文章中介绍了数据类型&#xff0c;以及printf函数的使用。 C语言中的数…

postgresql(Windows)初始化数据库教程

省流&#xff1a;本文章内容讲的是如何初始化postgresql数据库环境&#xff0c;前提是已经安装好postgresql数据库&#xff0c;安装步骤参考postgresql&#xff08;Windows&#xff09;安装教程 # 开始&#xff1a;安装postgresql-12.14-2-windows-x64.exe完成后进行初始化数据…

Vue待办事项(组件,模块化)

//html页面代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> <style> * { padding: 0; margin: 0; }…

洋州影院购票系统:如何用Java、Spring Boot、Vue和MySQL实现现代化管理

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

用户ssh正确密码登陆均报错Permission denied, please try again.处理方法

一个树莓派镜像&#xff0c;启动后发现没有 sshd 功能&#xff0c;于是 启用 openssh&#xff0c;重新启动&#xff0c;又发现树莓派拒绝 ssh 连接请求。 我的一台树莓派IP是&#xff1a;192.168.59.133任何服务器使用任何用户ssh均报错&#xff0c;甚至连自己都不能ssh自己。 …

Day 25 | 回溯 216.组合总和III 、17.电话号码的字母组合

216.组合总和III 题目 文章讲解 视频讲解 思路&#xff1a; 以回溯函数做对称&#xff0c;上面做了什么操作&#xff0c;下面也是 class Solution {List<List<Integer>> result new ArrayList<>();LinkedList<Integer> path new LinkedList<&g…

在Java中调企微机器人发送消息到群里

目录 如何使用群机器人 消息类型及数据格式 文本类型 markdown类型 图片类型 图文类型 文件类型 模版卡片类型 文本通知模版卡片 图文展示模版卡片 消息发送频率限制 文件上传接口 Java 执行语句 String url "webhook的Url"; String result HttpReque…

pytest - Getting Start

前言 项目开发中有很多的功能&#xff0c;通常开发人员需要对自己编写的代码进行自测&#xff0c;除了借助postman等工具进行测试外&#xff0c;还需要编写单元测试对开发的代码进行测试&#xff0c;通过单元测试来判断代码是否能够实现需求&#xff0c;本文介绍的pytest模块是…

【超详细!各版本通用Matlab入门教程】0基础学会可用于毕业论文制图、数学,线代概率论运算等

MATLAB 下载、安装方法&#xff1a; 【若未安装环境&#xff0c;可以点击下方链接教程先学习安装&#xff0c;再进行MATLAB入门学习】 点击下方文字&#xff1a;即可跳转MATLAB下载&安装教程 下载&安装MATLAB 1.常识 1.1注释方法 % 中文内容【注释内容】 %% 段落注…

计算机导论10-软件与软件工程

文章目录 软件软件的概念软件的定义软件的特征 软件的保护与授权软件的法律保护软件许可 软件工程软件危机软件危机的概念产生软件危机的原因 软件工程的概念软件工程的定义软件工程基本原理软件工程框架软件工程三要素 软件工程方法学软件工程方法软件工程工具软件工程过程 软…