Golang 语言 Channel 的使用方式

一、无缓存 channel

        无缓冲channel 可用于两个goroutine 之间 传递信号,比如以下示例:

        顺序打印1 至 100 的奇数和偶数:

import ("fmt""time"
)func main() {block := make(chan struct{})go odd(block)go even(block)time.Sleep(time.Second)fmt.Println("done")}func odd(block chan struct{}) {for i := 1; i < 100; i++ {<-blockif i%2 == 1 {fmt.Println("奇数:", i)}}
}func even(block chan struct{}) {for i := 1; i < 100; i++ {<-blockif i%2 == 0 {fmt.Println("偶数:", i)}}
}

上面这段代码,我们使用一个无缓冲channel  作为两个gorountie 之间的信号传递的桥梁。

主子 goroutine  之间传递信号

func main() {block := make(chan struct{})go func() {for i := 0; i < 10; i++ {fmt.Println(i)}close(block)}()<-blockfmt.Println("done")}

我们使用一个无缓冲channel 作为主子goroutine 之间的信号传递的桥梁,通过信号传递,主gorountine  运行结束直接再退出。

二、有缓冲 channel

        有缓冲channel  可以作用于解耦操作,模拟消息队列。“生产者”和“消费者”只需各自处理channel ,实现解耦。

        解耦生产者和消费者。

func main() {task := make(chan int, 10)go consumer(task)//生成者for i := 0; i < 10; i++ {task <- i}time.Sleep(time.Second * 2)
}func consumer(task <-chan int) {for i := 0; i < 10; i++ {go func(id int) {t := <-taskfmt.Println(id, t)}(i)}
}

我们使用一个有缓冲的channel , 将生产者,消费者做解耦操作

输出结果:

三、超时操作和定时器

       我们还可以通过select 和channel ,实现超时操作和定时器

        超时操作:


import ("fmt""time"
)func main() {c1 := make(chan string, 1)go func() {time.Sleep(2 * time.Second)c1 <- "result 1"}()select {case res := <-c1:fmt.Println(res)case <-time.After(1 * time.Second):fmt.Println("timeout 1")}c2 := make(chan string, 1)go func() {time.Sleep(2 * time.Second)c2 <- "result 2"}()select {case res := <-c2:fmt.Println(res)case <-time.After(3 * time.Second):fmt.Println("timeout 1")}}

通过c1 和 c2 两个channel ,分别模拟出超时和未超时场景

定时器:

func main() {ticker := time.NewTicker(500 * time.Millisecond)done := make(chan bool)go func() {for {select {case <-done:returncase t := <-ticker.C:fmt.Println("Tick at ", t)}}}()time.Sleep(1600 * time.Millisecond)ticker.Stop()done <- truefmt.Println("Ticker stopped")
}

我们定义一个打点器,每间隔500Ms执行一次操作,当打点stop时,通过一个无缓冲channel 传递退出信号

三、总结

本文我们介绍了一些关于 Channel 的使用方式,我们在阅读完本文后可以了解无缓冲 channel 作为信号传递的使用方式和有缓冲 channel 解耦操作的方式,以及 channel 与 select 配合使用的用法。

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

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

相关文章

Element Plus常见基础组件(一)

基础组件 Button 按钮 一、基础用法 <el-button>默认按钮</el-button> <el-button type"primary">主要按钮</el-button>二、按钮类型 (type) 类型说明示例代码default默认按钮<el-button>默认</el-button>primary主要按钮&a…

sdxl量化加速笔记

文章目录一、量化加速sdxl模型1&#xff09;涉及模型2&#xff09;环境安装3&#xff09;转换模型safetensor to pytorch文件4&#xff09;tensorRT的环境准备&#xff08;1&#xff09;下载tensorRT 10.10&#xff08;2&#xff09;下载cuda一、量化加速sdxl模型 1&#xff0…

西门子 G120 变频器全解析:从认知到参数设置

在工业自动化领域&#xff0c;变频器作为电机驱动的核心设备&#xff0c;其稳定运行与精准控制直接影响生产效率。西门子 G120 变频器凭借可靠性能与灵活配置&#xff0c;成为众多工业场景的优选。本文将从基础认知、操作面板到参数设置&#xff0c;全方位带你掌握 G120 变频器…

【自动化运维神器Ansible】YAML支持的数据类型详解:构建高效Playbook的基石

目录 1 YAML数据类型概述 1.1 为什么数据类型很重要&#xff1f; 1.2 YAML数据类型分类 2 标量类型&#xff08;Scalars&#xff09; 2.1 字符串&#xff08;String&#xff09; 2.2 布尔值&#xff08;Boolean&#xff09; 2.3 数值&#xff08;Numbers&#xff09; 2…

基于岗位需求的康养休闲旅游服务实训室建设方案

一、康养休闲旅游服务实训室建设方案建设需求分析康养休闲旅游服务行业的快速发展对技能人才提出了精准化、场景化的能力要求&#xff0c;康养休闲旅游服务实训室建设方案需紧密对接健康咨询、接待服务、康乐服务等核心岗位群的实际需求。从岗位技能来看&#xff0c;健康咨询岗…

MES 与工业物联网(IIoT)的化学反应:为何是智能工厂的 “神经中枢”?

从“被动救火”到“主动预警”的工厂革命想象一下&#xff0c;当你正在家中熟睡时&#xff0c;智能手环突然震动&#xff0c;提醒你心率异常&#xff1b;早上出门前&#xff0c;手机 APP 告诉你爱车的某个零件即将达到磨损极限&#xff0c;建议及时更换。这些日常生活中的智能预…

工作好用小工具积累

1、内部环境太多&#xff0c;网站导航git地址&#xff1a;https://github.com/hslr-s/sun-panel/releases gitee地址&#xff1a;https://gitee.com/luofei1284999247/sun-panel

智能Agent场景实战指南 Day 26:Agent评估与性能优化

【智能Agent场景实战指南 Day 26】Agent评估与性能优化 开篇 欢迎来到"智能Agent场景实战指南"系列的第26天&#xff01;今天我们将深入探讨智能Agent的评估方法与性能优化技术。构建高效、可靠的智能Agent系统需要完善的评估体系和优化策略&#xff0c;本文将系统…

机器学习——下采样(UnderSampling),解决类别不平衡问题,案例:逻辑回归 信用卡欺诈检测

过采样&#xff1a; 机器学习——过采样&#xff08;OverSampling&#xff09;&#xff0c;解决类别不平衡问题&#xff0c;案例&#xff1a;逻辑回归 信用卡欺诈检测-CSDN博客 &#xff08;完整代码在底部&#xff09; 使用下采样解决类别不平衡问题 —— 以信用卡欺诈识别为…

Qt 槽函数被执行多次,并且使用Qt::UniqueConnection无效【已解决】

Qt 槽函数被执行多次&#xff0c;并且使用Qt::UniqueConnection无效引言一、问题描述二、解决方案三、深入了解信号和槽绑定机制引言 之前刚遇到 - 信号和槽正常连接返回true&#xff0c;但发送信号后槽函数无响应问题&#xff0c;现在又遇到槽函数执行多次&#xff0c;使用Qt…

Autosar Nm-网管报文PNC停发后无法休眠问题排查

文章目录前言Autosar CanNm标准中的相关参数CanNmAllNmMessagesKeepAwakePN过滤功能CanNm_ConfirmPnAvailability问题描述问题原因排查解决方案扩展总结前言 Autosar Nm中针对于支持PN功能的收发器&#xff0c;要求PNC停发后允许进入休眠模式&#xff0c;开发过程中遇到PNC停发…

RK3568下的进程间通信:基于UDP的mash网络节点通信

基于UDP的mash网络节点通信系统实现: 最近的项目中需要实现一个功能,类似mash网络的功能,比如 类似下图中的多个节点之间,相互之间通信, 节点A自身的通信列表中,只有B和C,所以A发出的消息给B和C,依次类推,A发送的消息所有节点都能收到,同理,其他节点比如K节点发送的…

Effective C++ 条款17:以独立语句将newed对象置入智能指针

Effective C 条款17&#xff1a;以独立语句将newed对象置入智能指针核心思想&#xff1a;使用智能指针管理动态分配的对象时&#xff0c;必须确保new操作与智能指针构造在同一独立语句中完成&#xff0c;避免编译器优化顺序导致的内存泄漏。 ⚠️ 1. 跨语句初始化的危险性 资源…

Linux iptables防火墙操作

资料&#xff1a; 网络运维相关 - iptables 【Main】 https://www.zsythink.net/archives/tag/iptables/ netfilter 在 Linux 内核 TCP/IP协议栈中的位置 【框架】【Aulaxiry】 https://zhuanlan.zhihu.com/p/93630586 1 概念详解 ● 防火墙概念 ○ 主机防火墙 网络防火墙 ○…

飞书推送工具-自动化测试发送测试报告一种方式

飞书推送工具 要获取飞书开发所需的 APP_ID、APP_SECRET 以及用户的 USER_ID&#xff0c;需通过飞书开放平台和飞书客户端的相关设置操作。以下是详细步骤&#xff1a; 一、获取 APP_ID 和 APP_SECRET&#xff08;飞书应用凭证&#xff09; APP_ID 和 APP_SECRET 是飞书开放…

从零开始的云计算生活——第三十七天,跬步千里,ansible之playbook

目录 一.故事剧情 二.Playbook简介 三.Playbook核心元素(重要) 四.Playbook语法 五.Playbook的运行方式 六.Playbooks中tasks语法使用 1、file 2、lineinfile 3、replace 4、shell 5、debug 6、template/copy 7、fetch 8、unarchive 9、wait_for 10、yum 11、…

AI驱动下的数据新基建:腾讯游戏数据资产治理与湖仓架构革新

在大模型技术迅猛发展的今天&#xff0c;AI 正深度重塑数据基础设施&#xff0c;推动其向智能化快速演进。如何将 AI 深度融入数据管理&#xff0c;释放数据的潜在价值、提升运营效率&#xff0c;成为企业在构建 AI 驱动的数据资产管理体系的核心问题。在近期举办的“DataFun A…

ubuntu 系统风扇控制软件 CoolerControl

背景 A6000显卡的温度一直都是86度左右&#xff0c;GPU的风扇转速不够大。 我首先把 nvidia的驱动更新了&#xff0c;但是发现风扇依然依然保持在较低的转速。 后面无意间搜到了CoolerControl 这个linux平台的风扇控制软件。设置之后&#xff0c;增加了风扇的转速&#xff0c;…

Oracle 11gR2 Clusterware应知应会

Oracle 11gR2 Clusterware应知应会 关键特性 启动顺序 日志路径 资源状态 资源管理 关键特性 📖 Oracle 11gR2 Clusterware的一些关键特性如下: 在安装运行11gR2的Real Application Clusters数据库之前需要先安装11gR2 Clusterware。 GRID home包括Oracle Clusterware和AS…

微信小程序苹果手机和安卓,怎么做适配

1. 基于 rpx 单位进行布局适配微信小程序采用 rpx 作为尺寸单位&#xff0c;以实现不同设备的布局适配。小程序的屏幕宽度固定为 750rpx&#xff0c;在不同设备上通过动态计算 1rpx 对应的像素值进行适配。例如&#xff0c;在 iPhone 6 中&#xff0c;屏幕宽度为 375px&#xf…