Golang|Channel 相关用法理解

news2025/4/20 15:10:26

文章目录

    • 用 channel 作为并发小容器
    • channel 的遍历
    • channel 导致的死锁问题
    • 用 channel 传递信号
    • 用 channel 并行处理文件
    • 用channel 限制接口的并发请求量
    • 用 channel 限制协程的总数量

用 channel 作为并发小容器

在这里插入图片描述
在这里插入图片描述

  • 注意这里的 ok 如果为 false,表示此时不仅channel为空,而且channel已经被关闭了

channel 的遍历

在这里插入图片描述

  • 注意,遍历会使头指针往后移,相当于取走元素
  • 如果 close channel 注释掉,也不会报错,但是会阻塞,导致输出bye bye这一句代码得不到执行
  • 遍历的另外一种写法

在这里插入图片描述

channel 导致的死锁问题

  • 上面的main方法是等3秒钟结束main协程,更好的方法是使用waitGroup

在这里插入图片描述
在这里插入图片描述

  • 如果 close channel 注释掉,程序执行的时候会报错 fatal error: all goroutines are asleep - deadlock!
  • travese和main都阻塞了

用 channel 传递信号

  • 可以用向channel中传递信号,代替waitGroup,优雅地等子协程结束

在这里插入图片描述

  • struct{} 空结构体类型,空结构体实例 struct{}{}
  • 空结构体在go语言里是一种特殊的结构体,go语言通过一个统一的引用变量来表示所有的空结构体,而且不占用任何的内存空间
  • 使用空结构体,语义会更加明确且不占内存

在这里插入图片描述

  • 在 Go 语言(Golang)中,reflect 是一个非常强大的包,提供了 运行时反射机制,可以在运行时检查变量的类型、获取或设置变量的值。
// 获取类型和值

var x int = 42
t := reflect.TypeOf(x) // reflect.Type
v := reflect.ValueOf(x) // reflect.Value

fmt.Println("类型:", t)      // int
fmt.Println("值:", v.Int()) // 42
// 修改变量的值(需要传指针)

var x int = 10
v := reflect.ValueOf(&x)           // 注意要传指针
v.Elem().SetInt(100)               // 修改值
fmt.Println("x的新值:", x)         // 100
// 检查变量类型

func checkType(i interface{}) {
    t := reflect.TypeOf(i)
    switch t.Kind() {
    case reflect.Int:
        fmt.Println("是整数")
    case reflect.String:
        fmt.Println("是字符串")
    default:
        fmt.Println("其他类型")
    }
}
// 结构体字段操作

type Person struct {
    Name string
    Age  int
}

p := Person{"Tom", 30}
v := reflect.ValueOf(p)
t := reflect.TypeOf(p)

for i := 0; i < t.NumField(); i++ {
    field := t.Field(i)
    value := v.Field(i)
    fmt.Printf("%s: %v\n", field.Name, value)
}

用 channel 并行处理文件

  • channel 不仅可以当作数据容器使用,也可以当作信号容器来使用
  • 下面这个例子是要把多个txt文件合并为一个txt文件,一个常规的思路就是我们顺序读取文件,每读取一行就把这一行对应地写入到新的文件里面去,但是io操作很消耗时间,且三个文件毫不相关,怎么加速?
  • 考虑三个goroutine并行读,且往一个buffer channel写数据,由一个goroutinue往buffer channel里读数据写入文件,这样可以协调读者和写者的速度不匹配问题

在这里插入图片描述

在这里插入图片描述

  • 初始化pc_sync里面有3个元素,协程完成后会从pc_sync取走一个元素,当所有协程结束后,pc_sync为空

在这里插入图片描述
在这里插入图片描述

用channel 限制接口的并发请求量

  • 有时候我们需要限制微服务接口的并发请求度,因为有些接口会涉及到大量的cpu计算或者是内存开销,如果瞬间并发度太大的话,服务器负载会很高
    在这里插入图片描述
  • 但是如果限制了的话必然会牺牲用户的体验
  • 用channel的阻塞机制实现

在这里插入图片描述

用 channel 限制协程的总数量

  • 需要封装,对于所有的协程创建都去走一个统一的入口

在这里插入图片描述

  • ticker 实际上就是每隔一段时间会给ticker.C中放入一个元素

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

C++ - #命名空间 #输入、输出 #缺省参数 #函数重载 #引用 # const 引用 #inline #nullptr

文章目录 前言 一、实现C版本的hello world 二、命名空间 1、namespace 的价值 2、namespace 的定义 (1.域会影响一个编译器编译语法时的查找规则 (2、域会影响生命周期 (3、命名空间域只能定义在全局 (4、编译器会自动合并相同命名空间中的内容 (5、C标准库放在命名…

JSON处理工具/框架的常见类型及详解,以Java语言为例

以下是JSON处理工具/框架的常见类型及详解&#xff0c;以Java语言为例&#xff1a; 一、主流JSON处理工具对比 Jackson&#xff08;推荐&#xff09; 特点&#xff1a;高性能、功能丰富&#xff0c;支持注解&#xff08;如JsonProperty&#xff09;、树形模型&#xff08;Json…

中间件--ClickHouse-1--基础介绍(列式存储,MPP架构,分布式计算,SQL支持,向量化执行,亿万级数据秒级查询)

1、概述 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。它由俄罗斯的互联网巨头Yandex为解决其内部数据分析需求而开发&#xff0c;并于2016年开源。专为大规模数据分析&#xff0c;实时数据分析和复杂查询设计&#xff0c;具有高性能、实时数据和可扩展性等…

Java中的经典排序算法:插入排序、希尔排序、选择排序、堆排序与冒泡排序(如果想知道Java中有关插入排序、希尔排序、选择排序、堆排序与冒泡排序的知识点,那么只看这一篇就足够了!)

前言&#xff1a;排序算法是计算机科学中的基础问题之一&#xff0c;它在数据处理、搜索算法以及各种优化问题中占有重要地位&#xff0c;本文将详细介绍几种经典的排序算法&#xff1a;插入排序、选择排序、堆排序和冒泡排序。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解…

K8S+Prometheus+Consul+alertWebhook实现全链路服务自动发现与监控、告警配置实战

系列文章目录 k8s服务注册到consul prometheus监控标签 文章目录 系列文章目录前言一、环境二、Prometheus部署1.下载2.部署3.验证 三、kube-prometheus添加自定义监控项1.准备yaml文件2.创建新的secret并应用到prometheus3.将yaml文件应用到集群4.重启prometheus-k8s pod5.访…

uniapp-商城-25-顶部模块高度计算

计算高度&#xff1a; 使用computed进行顶部模块的计算。 总高度&#xff1a;bartotalHeight log 介绍--收款码这一条目 也就是上一章节的title的高度计算 bodybarheight。 在该组件中&#xff1a; js部分的代码&#xff1a; 包含了导出的名字&#xff1a; shop-head…

非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较

非关系型数据库&#xff08;NoSQL&#xff09;与 关系型数据库&#xff08;RDBMS&#xff09;的比较 一、引言二、非关系型数据库&#xff08;NoSQL&#xff09;2.1 优势 三、关系型数据库&#xff08;RDBMS&#xff09;3.1 优势 四、结论 &#x1f496;The Begin&#x1f496;…

蓝桥杯2024国B数星星

小明正在一棵树上数星星&#xff0c;这棵树有 n 个结点 1,2,⋯,n。他定义树上的一个子图 G 是一颗星星&#xff0c;当且仅当 G 同时满足&#xff1a; G 是一棵树。G 中存在某个结点&#xff0c;其度数为 ∣VG​∣−1。其中 ∣VG​∣ 表示这个子图含有的结点数。 两颗星星不相…

中科院1区顶刊Expert Systems with Applications ESO:增强型蛇形算法,性能不错

Snake Optimizer&#xff08;SO&#xff09;是一种优化效果良好的新颖算法&#xff0c;但由于自然规律的限制&#xff0c;在探索和开发阶段参数更多是固定值&#xff0c;因此SO算法很快陷入局部优化并慢慢收敛。本文通过引入新颖的基于对立的学习策略和新的动态更新机制&#x…

Flask+Influxdb+grafna构建电脑性能实时监控系统

Influx下载地址&#xff0c;这里下载了以下版本influxdb-1.8.5_windows_amd64.zip 运行前需要先启动Influx数据库&#xff1a; 管理员方式运行cmd->F:->cd F:\influxdb\influxdb-1.8.5-1->influxd -config influxdb.conf&#xff0c;以influxdb.conf配置文件启动数…

若伊微服务版本教程(自参)

第一步 若伊官网下载源码 https://ruoyi.vip/ RuoYi-Cloud: &#x1f389; 基于Spring Boot、Spring Cloud & Alibaba的分布式微服务架构权限管理系统&#xff0c;同时提供了 Vue3 的版本 git clone 到 本地 目录如下&#xff1a; 第二部 参考官网 运行部署说明 环境部署…

ESP32与STM32哪种更适合初学者?

目录 1、ESP32&#xff1a;物联网时代的“网红” 2、STM32&#xff1a;工业界的“常青树” 3、到底谁更容易&#xff1f; 无论是刚入坑的小白&#xff0c;还是想扩展技术栈的老鸟&#xff0c;在选择主力 MCU 时&#xff0c;学习曲线绝对是重要的考量因素。ESP32 以其强大的 …

秒杀秒抢系统开发:飞算 JavaAI 工具如何应对高并发难题?

秒杀、秒抢活动已成为电商促销与吸引流量的常用手段。然而&#xff0c;此类活动所带来的高并发访问&#xff0c;对系统性能构成了巨大挑战。如何确保系统在高并发场景下依然能够稳定、高效运行&#xff0c;成为开发者亟待解决的关键问题。飞算 JavaAI 工具作为一款功能强大的开…

C# 将Excel格式文件导入到界面中,用datagridview显示

界面按钮不做介绍。 主要代码: //用于获取从上一个页面传过来datagridview标题 public DataTable GetHeader { get; set; } private void UI_EXPINFO_Load(object sender, EventArgs e) { //页面加载显示listbox1中可…

Spring Boot整合难点?AI一键生成全流程解决方案

在当今的软件开发领域&#xff0c;Spring Boot 凭借其简化开发流程、快速搭建项目的优势&#xff0c;成为了众多开发者的首选框架。然而&#xff0c;Spring Boot 的整合过程并非一帆风顺&#xff0c;常常会遇到各种难点。而飞算 JavaAI 的出现&#xff0c;为解决这些问题提供了…

MySQL 锁机制全景图:分类、粒度与示例一图掌握

✅ 一、按粒度分类&#xff08;锁的范围大小&#xff09; 1. 表级锁&#xff08;Table Lock&#xff09; 锁住整张表粒度大&#xff0c;开销小&#xff0c;并发性差常见于&#xff1a;MyISAM 引擎 &#x1f4cc; 示例&#xff1a; LOCK TABLES user WRITE; -- 会锁住整个 u…

STM32江科大----------PID算法

声明&#xff1a;本人跟随b站江科大学习&#xff0c;本文章是观看完视频后的一些个人总结和经验分享&#xff0c;也同时为了方便日后的复习&#xff0c;如果有错误请各位大佬指出&#xff0c;如果对你有帮助可以点个赞小小鼓励一下&#xff0c;本文章建议配合原视频使用❤️ 如…

架构师面试(二十九):TCP Socket 编程

问题 今天考察网络编程的基础知识。 在基于 TCP 协议的网络 【socket 编程】中可能会遇到很多异常&#xff0c;在下面的相关描述中说法正确的有哪几项呢&#xff1f; A. 在建立连接被拒绝时&#xff0c;有可能是因为网络不通或地址错误或 server 端对应端口未被监听&#x…

基础学习(4): Batch Norm / Layer Norm / Instance Norm / Group Norm

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1 batch normalization(BN)2 Layer normalization (LN)3 instance normalization (IN)4 group normalization (GN)总结 前言 对 norm/batch/instance/group 这…

Idea集成AI:CodeGeeX开发

当入职新公司&#xff0c;或者调到新项目组进行开发时&#xff0c;需要快速熟悉项目代码 而新的项目代码&#xff0c;可能有很多模块&#xff0c;很多的接口&#xff0c;很复杂的业务逻辑&#xff0c;更加有与之前自己的代码风格不一致的现有复杂代码 更别提很多人写代码不喜…