【go从零单排】Stateful Goroutines(有状态的 goroutines)

ops/2024/11/17 3:22:00/

挪威特罗姆瑟夜景

🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。

📗概念

在 Go 中,有状态的 goroutines(Stateful Goroutines)是指那些能够保留状态信息的 goroutines。这种设计模式通常用于需要在多个调用之间维护状态的场景,例如处理请求、管理连接、维护计数器等。

💻代码

package main//导入math/rand 用于生成随机数。
//sync/atomic 提供原子操作的支持。
import ("fmt""math/rand""sync/atomic""time"
)// readOp 结构体用于表示读操作,包含一个键 key 和一个响应通道 resp。
type readOp struct {key  intresp chan int
}// readOp 结构体用于表示读操作,包含一个键 key 和一个响应通道 resp。
type writeOp struct {key  intval  intresp chan bool
}func main() {//声明两个无符号整型变量 readOps 和 writeOps,用于计数读写操作。var readOps uint64var writeOps uint64//创建两个通道 reads 和 writes,分别用于接收读操作和写操作。reads := make(chan readOp)writes := make(chan writeOp)go func() {//启动一个 goroutine,维护一个状态 state,这是一个映射,存储键值对。var state = make(map[int]int)for {//使用 select 语句监听 reads 和 writes 通道:select {//如果接收到读操作,从 state 中读取对应的值并通过 resp 通道返回。case read := <-reads:read.resp <- state[read.key]//如果接收到写操作,将值写入 state 中,并通过 resp 通道返回操作成功的信号。case write := <-writes:state[write.key] = write.valwrite.resp <- true}}}()//启动 100 个 goroutinefor r := 0; r < 100; r++ {go func() {for {//创建一个随机键的 readOp 实例并发送到 reads 通道。read := readOp{key:  rand.Intn(5),resp: make(chan int)}reads <- read<-read.resp//创建一个随机键的 readOp 实例并发送到 reads 通道。atomic.AddUint64(&readOps, 1)//每次循环后休眠 1 毫秒。time.Sleep(time.Millisecond)}}()}//启动 10 个 goroutinefor w := 0; w < 10; w++ {go func() {for {//创建一个随机键和随机值的 writeOp 实例并发送到 writes 通道。write := writeOp{key:  rand.Intn(5),val:  rand.Intn(100),resp: make(chan bool)}writes <- write<-write.resp//等待响应并通过原子操作增加 writeOps 的计数。atomic.AddUint64(&writeOps, 1)//每次循环后休眠 1 毫秒。time.Sleep(time.Millisecond)}}()}time.Sleep(time.Second)//使用 atomic.LoadUint64 获取最终的读写操作计数并打印。readOpsFinal := atomic.LoadUint64(&readOps)fmt.Println("readOps:", readOpsFinal)writeOpsFinal := atomic.LoadUint64(&writeOps)fmt.Println("writeOps:", writeOpsFinal)
}
//输出
//readOps: 81299
//writeOps: 8163

有状态的 Goroutines 的特点

  • 状态管理:有状态的 goroutines 可以在其生命周期内维护状态信息,这样它们可以根据之前的操作或输入做出决策。
  • 并发安全:在并发环境中,状态的管理需要确保安全性,通常使用通道、互斥锁或其他同步机制来保护共享状态。
  • 封装性:将状态和行为封装在 goroutine 内部,使得外部无法直接访问状态,从而增强了模块化和封装性。

🔍理解

  • 并发读写:代码实现了一个简单的并发读写操作,使用通道来协调读写请求。
  • 原子操作:使用 sync/atomic 包中的原子操作来安全地更新读写计数,避免数据竞争。
  • 随机访问:读和写操作都是基于随机生成的键值,使得操作更加多样化。
  • 无锁设计:通过通道和 goroutine 的组合,避免了传统的锁机制,简化了并发控制。

💪无人扶我青云志,我自踏雪至山巅。
在这里插入图片描述


http://www.ppmy.cn/ops/134321.html

相关文章

docker 镜像索引和用法

Docker 镜像索引&#xff08;Image Index&#xff09;和清单列表&#xff08;Manifest List&#xff09;是 Docker 用于管理和分发多架构镜像的关键概念。下面将详细介绍这两个概念以及它们的用法。 1. Docker 镜像索引 (Image Index) 定义: Docker 镜像索引是一个逻辑集合&…

Mac os 系统上如何开启远程登录的 ssh 22 端口

macOS 允许使用 SSH 连接&#xff0c;但为了安全起见&#xff0c;需要手动启动 SSH 服务&#xff0c;有两种方法可以激活远程登录。 方法一&#xff1a;界面化操作 1. 打开“系统偏好设置”&#xff0c;点击屏幕左上角的 Apple 图标&#xff0c;然后选择 系统偏好设置。 2. …

展会邀约|加速科技与您相约IC China 2024!

第二十一届中国国际半导体博览会&#xff08; IC China 2024&#xff09;将于 2024 年11月18日—11月20日在北京国家会议中心举行。加速科技将携高性能测试机ST2500EX、ST2500E、eATE及全系测试解决方案亮相E2馆B150展位。博览会期间&#xff0c;将同期举办"半导体产业前沿…

全面评估ASPICE标准对汽车软件开发的影响与效果

在评估ASPICE&#xff08;Automotive SPICE&#xff09;标准的效果时&#xff0c;可以从多个维度进行考量&#xff0c;以确保全面且准确地反映该标准对汽车软件和嵌入式系统开发过程的积极影响。以下是一些关键的评估方面&#xff1a; 1. 过程改进与标准化 标准化程度&#xf…

036 RabbitMQ消息确认 死信队列 延时队列

文章目录 生产者确认模式application.propertiesMessageController.javaMessageConfirmRallback.java 生产者回退模式application.propertiesMessageConfirmRallback.javaMessageController.java 消费者手动确认application.propertiesConsumerAckQueueListener.java 死信队列延…

如何使用 python 中的 Pillow 创建可自定义的图标生成器

在本篇博客中&#xff0c;我们将探讨如何使用 wxPython 和 Pillow 库创建一个简单的图标生成器。用户可以通过该工具选择目标文件夹&#xff0c;并生成三种不同尺寸&#xff08;16x16、48x48、128x128&#xff09;的PNG格式图标文件。图标将采用“截图框”的主题&#xff0c;通…

猫狗识别之BUG汇总

一、github登不上去问题 下载watt toolkit 下载地址&#xff1a;https://steampp.net/ 可以下载后加速&#xff0c;访问github 二、猫狗总体参考核心 B哥的博客 https://github.com/bubbliiiing/classification-keras?tabreadme-ov-file 三、CSDN很多会员才能阅读问题 根据…

电子应用产品设计方案-9:全自动智能马桶系统设计方案

一、系统概述 本全自动智能马桶系统旨在提供舒适、卫生、便捷和智能化的如厕体验。通过融合多种传感器技术、电子控制单元和机械执行机构&#xff0c;实现马桶的自动冲洗、座圈加热、臀部清洗、烘干等功能&#xff0c;并具备智能感应、用户个性化设置和健康监测等特色功能。 二…