Golang|Channel 相关用法理解

文章目录

    • 用 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.Valuefmt.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 stringAge  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.mzph.cn/news/901410.shtml

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

相关文章

Windows单机模拟MySQL主从复制

这里写自定义目录标题 下载MySQL ZIP压缩包安装主库1、创建配置文件2、安装服务3、初始化数据库4、启动服务5、配置主库 安装从库1、配置ini文件2、安装服务3、初始化数据库4、启动服务5、配置从库6、验证从库状态 操作主库验证 下载MySQL ZIP压缩包 https://dev.mysql.com/do…

OSPF路由引入

一、基本概念与作用 1.OSPF路由引入指通过自治系统边界路由器&#xff08;ASBR&#xff09;将外部路由&#xff08;如BGP、RIP、静态路由或其他OSPF进程的路由&#xff09;注入当前OSPF域&#xff0c;实现跨协议或跨区域的网络互通‌。 其核心作用包括&#xff1a; ‌扩展网…

弱口令爆破

1.简单介绍 弱口令是指一些简单易猜的密码&#xff0c;可通过社工方式和一些爆破工具进行破解&#xff0c;以下介绍一款爆破工具的用法。burpsuite简称BP&#xff0c;一款可以利用字典破解账户密码的工具。 2.部署网站 可以使用PHPstudy的Apache服务&#xff0c;也可以使用I…

Vue3+Vite前端项目部署后部分图片资源无法获取、动态路径图片资源报404错误的原因及解决方案

目录 Vue3vite前端项目部署后部分图片资源无法获取、动态路径图片资源报404错误的原因及解决方案 一、情景介绍 1、问题出现的场景 2、无法加载的图片写法 二、反向代理原理简介 三、造成该现象的原因 四、解决方案 1、放弃动态渲染 2、在页面挂载的时候引入图片资源 …

详解如何从零用 Python复现类似 GPT-4o 的多模态模型

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…

榕壹云无人共享系统:基于SpringBoot+MySQL+UniApp的物联网共享解决方案

无人共享经济下的技术革新 随着无人值守经济模式的快速发展&#xff0c;传统共享设备面临管理成本高、效率低下等问题。榕壹云无人共享系统依托SpringBootMySQLUniApp技术栈&#xff0c;结合物联网与移动互联网技术&#xff0c;为商家提供低成本、高可用的无人化运营解决方案。…

基于PHP的酒店网上订房系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 酒店服务是旅游行业的一个重要组成部分&#xff0c;它的作用已经从过去的单一的住宿、结算帐务向全面、高水平的服务型酒店转变。酒店的服务工作贯穿于整个酒店的市场营销、预定、入住、退房、结账等环节&#xff0c;酒店要提高整体工作水平&#xff0c;简化工作程序&…

【Linux生成SSH秘钥实现远程连接】Linux生成SSH秘钥对与修改服务配置文件实现无密码远程连接

文章目录 前言1. Linux 生成SSH秘钥对2. 修改SSH服务配置文件3. 客户端秘钥文件设置4. 本地SSH私钥连接测试5. Linux安装Cpolar工具6. 配置SSHTCP公网地址7. 远程SSH私钥连接测试8. 固定SSH公网地址9. 固定SSH地址测试 前言 在数字化江湖中&#xff0c;企业对各种技术的需求就…

# linux 设置宽容模式

linux 设置宽容模式 在Linux系统中&#xff0c;通常没有直接称为“宽容模式”的设置选项&#xff0c;但你可以通过几种方式来模拟或调整系统行为&#xff0c;使其表现得更加“宽容”&#xff0c;特别是在处理错误、权限问题或其他潜在问题时。以下是一些常见的方法&#xff1a…

【C++】——lambda表达式

&#x1f31f; 前言:​​C Lambda表达式,当函数开始"叛逆期"​​ 你是否有过这样的崩溃瞬间&#xff1f; 为了写个​​只用到一次​​的排序规则&#xff0c;被迫定义了一个类在std::for_each里塞函数指针&#xff0c;代码瞬间变成"古董级"写法看着层的循环…

深入解析B站androidApp接口:从bilibili.api.ticket.v1.Ticket/GetTicket到SendMsg的技术分析

前言 最近一段时间&#xff0c;我对B站的App接口进行了深入分析&#xff0c;特别是关注了认证机制和私信功能的实现。通过逆向工程和网络抓包&#xff0c;发现了B站移动端API的底层工作原理&#xff0c;包括设备标识生成机制、认证流程和消息传输协议。本文将分享这些研究成果…

从零开始学A2A一:A2A 协议概述与核心概念

A2A 协议概述与核心概念 学习目标 基础理解 掌握A2A协议的基本概念和背景理解协议的设计原则和核心思想了解协议在AI领域的重要性 技术掌握 熟悉A2A协议的核心功能组件掌握能力发现和任务管理机制理解多模态交互和安全通信原则 实践应用 能够设计基于A2A的智能体系统掌握协议…

2025.04.10-拼多多春招笔试第三题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 数字重排最大化问题 问题描述 LYA是一位专业的数字设计师。她手中有两个数字序列 s 1 s_1

苍穹外卖day04

Spring Task实现定时处理订单状态 作用&#xff1a;不需要输入提示信号&#xff0c;便可定时自动执行程序 使用步骤 1、启动类上加上注解&#xff08;EnableScheduling&#xff09;开启定时任务调度 2、专门创建一个包来管理执行定时任务的类&#xff0c;该类需要交给IOC容…

BFD:网络链路检测与联动配置全攻略

目录 BFD简介 BFD会话建立方式和检测机制 BFD会话建立过程 BFD工作流程 联动功能 BFD与OSPF联动配置需求 BFD与OSPF联动配置实现 BFD与VRRP联动配置需求 BFD与VRRP联动配置实现 单臂回声 BFD默认参数及调整方法 BFD简介 一种全网统一、检测迅速、监控网络中链…

【LLM】A2A 与 MCP:剖析 AI Agent 互联时代的两种关键协议

随着人工智能技术的飞速发展&#xff0c;AI Agent&#xff08;智能体&#xff09;正从理论走向实践&#xff0c;有望成为提升生产力的关键。然而&#xff0c;正如历史上任何新兴技术领域一样&#xff0c;标准的缺失导致了“筒仓效应”——不同来源、不同框架构建的 Agent 难以有…

免费下载 | 2025清华五道口:“十五五”金融规划研究白皮书

《2025清华五道口&#xff1a;“十五五”金融规划研究白皮书》的核心内容主要包括以下几个方面&#xff1a; 一、五年金融规划的重要功能与作用 凝聚共识&#xff1a;五年金融规划是国家金融发展的前瞻性谋划和战略性安排&#xff0c;通过广泛听取社会各界意见&#xff0c;凝…

滚轮控制目标臂长度调整相机距离

通过鼠标滚轮来控制摄像机目标臂长度 , 调整相机距离 看图就行,不多说,照着连就完事了

kernel32!GetQueuedCompletionStatus函数分析之返回值得有效性

第一部分&#xff1a;//#define STATUS_SUCCESS 0x0返回值为0 } else { // // Set the completion status, capture the completion // information, deallocate the associated IRP, and // attempt to write the…

UE5 Chaos :渲染网格体 (Render Mesh) 和模拟网格体 是如何关联的?为什么模拟网格体 可以驱动渲染网格体?

官方文献&#xff1a;https://dev.epicgames.com/community/learning/tutorials/pv7x/unreal-engine-panel-cloth-editor 这背后的核心是一种常见的计算机图形学技术&#xff0c;通常称为代理绑定 (Proxy Binding) 或 表面变形传递 (Surface Deformation Transfer)。 关联机制…