2014年3月13日 Go生态洞察:并发模式与管道取消技术


🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁

🦄 博客首页——🐅🐾猫头虎的博客🎐
🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基础入门篇)》 🐅 学会Golang语言,畅玩云原生,走遍大小厂~💐

🐅🐾猫头虎建议Go程序员必备技术栈一览表📖:

☁️🐳 Go语言开发者必备技术栈☸️:
🐹 GoLang | 🌿 Git | 🐳 Docker | ☸️ Kubernetes | 🔧 CI/CD | ✅ Testing | 💾 SQL/NoSQL | 📡 gRPC | ☁️ Cloud | 📊 Prometheus | 📚 ELK Stack


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🐅🐾🍁🐥


在这里插入图片描述

文章目录

    • 🐅🐾猫头虎建议Go程序员必备技术栈一览表📖:
  • 2014年3月13日 Go生态洞察:并发模式与管道取消技术 🐾
    • 摘要
    • 引言
    • 正文
      • Go中的管道是什么? 🧩
      • 数字平方示例 🔢
      • 并行处理:扇出和扇入 🔄
      • 提前停止 🛑
      • 明确的取消机制 🚫
      • 处理树形结构的数据 🔍
      • 并行化的限制 🔗
      • 总结
    • 参考资料
    • 下一篇预告
  • 原创声明

  • 原创作者: 猫头虎

  • 作者wx: Libin9iOak

  • 作者公众号: 猫头虎技术团队

在这里插入图片描述

2014年3月13日 Go生态洞察:并发模式与管道取消技术 🐾

摘要

🐾 大家好,我是猫头虎博主!今天要和大家探讨Go的并发模式,尤其是管道和取消技术。在这篇博客中,我们将深入挖掘Go的并发原语如何简化数据流管道的构建,并有效利用I/O与多核CPU。我们还将探索在操作失败时应对的细节,并引入干净处理失败的技术。让我们一起深入Go的世界,探索其并发之美!🚀

引言

Go的并发原语让构建数据流管道变得简单,能有效地利用I/O和多CPU。本文通过管道示例,强调操作失败时出现的微妙问题,并介绍如何干净地处理这些失败。

正文

Go中的管道是什么? 🧩

管道是连接通过通道(channel)的多个阶段(stages)的系列,每个阶段是一组运行相同函数的goroutines。它们通过inbound通道接收上游数据,处理这些数据,然后通过outbound通道发送到下游。

数字平方示例 🔢

Go中管道的一个简单例子是数字平方。我们先定义gen函数,它将整数列表转换为发出列表中整数的通道。然后是sq函数,它接收整数并返回其平方的通道。

func gen(nums ...int) <-chan int { /* ... */ }
func sq(in <-chan int) <-chan int { /* ... */ }

并行处理:扇出和扇入 🔄

扇出(fan-out)指多个函数可以从同一通道读取直到该通道关闭。扇入(fan-in)是通过将多个输入通道复用到一个单一通道上,然后在所有输入关闭时关闭该通道。

func merge(cs ...<-chan int) <-chan int { /* ... */ }

提前停止 🛑

在现实中,管道的阶段可能不会接收所有入站值。我们需要某种方式来让早期阶段停止产生后续阶段不需要的值。

明确的取消机制 🚫

在Go中,当主函数(main)决定在未接收所有值的情况下退出时,它必须通过一个名为done的通道告诉上游阶段的goroutines放弃他们正在尝试发送的值。

func main() { /* ... */ }

处理树形结构的数据 🔍

我们考虑一个更现实的管道,用于计算给定目录下所有文件的MD5校验和。我们通过分离MD5All为两个阶段的管道来实现。

并行化的限制 🔗

我们通过为读取文件创建固定数量的goroutines来限制内存分配,从而实现有界的并行。

func digester(done <-chan struct{}, paths <-chan string, c chan<- result) { /* ... */ }

总结

我们介绍了在Go中构建数据流管道的技术。处理此类管道中的失败是棘手的,因为每个阶段可能会在尝试向下游发送值时阻塞,而下游阶段可能不再关心传入的数据。我们展示了如何通过关闭通道来广播给所有由管道启动的goroutines一个“完成”信号,并定义了正确构建管道的指南。

参考资料

  • Go Concurrency Patterns
  • [Advanced Go Concurrency Patterns](https://blog.golang.org/advanced-go-con

currency-patterns)

  • Squinting at Power Series

下一篇预告

🔜 下一篇,我将探索Go的标志物:Go Gopher!我们将深入了解这个可爱的小家伙,并探讨它在Go社区中的意义和影响。敬请期待!


本文由猫头虎的Go生态洞察专栏收录,详情点击这里。

在这里插入图片描述

原创声明

======= ·

  • 原创作者: 猫头虎

  • 作者wx: Libin9iOak
    在这里插入图片描述

  • 作者公众号: 猫头虎技术团队

在这里插入图片描述

学习复习Go生态

本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,洞察Go生态,共同成长。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数学建模之插值法及代码

发现更多知识&#xff0c;欢迎访问Cr不是铬的个人网站 引言 数模比赛中&#xff0c;常常需要根据已知的函数点进行数据、模型的处理和分析&#xff0c;而有时候现有的数据是极少的&#xff0c;不足以支撑分析的进行&#xff0c;这时就需要使用一些数学的方法&#xff0c;“模…

阿里云高校计划学生和教师完成认证领取优惠权益

阿里云高校计划学生和教师均可参与&#xff0c;完成学生认证和教师验证后学生可以免费领取300元无门槛代金券和3折优惠折扣&#xff0c;适用于云服务器等全量公共云产品&#xff0c;订单原价金额封顶5000元/年&#xff0c;阿里云百科aliyunbaike.com分享阿里云高校计划入口及学…

MONGODB 的基础 NOSQL注入基础

首先来学习一下nosql 这里安装就不进行介绍 只记录一下让自己了解mongodb ubuntu 安装后 进入 /usr/bin ./mongodb即可进入然后可通过 进入的url链接数据库 基本操作 show dbshow dbsshow tablesuse 数据库名插入数据db.admin.insert({json格式的数据})例如 db.admin.inse…

Android手机如何用Charles抓包HTTPS接口

对Charles的安装和使用&#xff0c;这里就不重复介绍了&#xff0c;之前有介绍Charles工具。 本文重点介绍在Android手机上如何配置抓包环境 1.获取Charles配置 去Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Device or Remote Browser 查…

微软重磅发布4个适合初学者的机器学习资料

自媒体火起来后&#xff0c;很多科技大佬都开始写博客&#xff0c;录视频了&#xff0c;大佬一入行&#xff0c;整个行业卷上天&#xff0c;像我这样的也只能走资源整合之路了&#xff0c;不过这样也好&#xff0c;科技进步&#xff0c;人类发展需要他们。 除了个人&#xff0…

LiteOS同步实验(实现生产者-消费者问题)

效果如下图&#xff1a; 给大家解释一下上述效果&#xff1a;在左侧&#xff08;顶格&#xff09;的是生产者&#xff08;Producer&#xff09;&#xff1b;在右侧&#xff08;空格&#xff09;的是消费者&#xff08;Consumer&#xff09;。生产者有1个&#xff0c;代号为“0”…

斯坦福NLP课程来了

生成式AI&#xff0c;尤其是以ChatGPT为首的大语言模型正在改变人们的生活方式&#xff0c;我想一定有小伙伴想加入NLP这个行列。 微软重磅发布4个适合初学者的机器学习资料 我在前一篇文章中分享了微软人工智能初学者课程&#xff0c;其中的【生成式AI】非常适合初学者&…

Java 环境其他下载2

1 Eclipse Temurin Latest Releases | Adoptium Eclipse Temurin 是由基于 OpenJDK 的开源 Java SE 产生的构建版本。Temurin 适用于 广泛的平台 以及诸多 Java SE 版本。以下列出了推荐用于生产的最新版本&#xff0c;并且定期由 Adoptium 社区发布更新和支持。迁移帮助、容器…

kettle spoon连接MySQL8.0数据库报错解决方法

kettle 连接 mysql 8.0报错&#xff0c;显示无法连接到数据库服务 错误连接数据库 [11] : org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to connect to the databaseError connecting to database: (using class org.gjt.mm.mysql.D…

​​【项目实战】犬只牵绳智能识别:源码详细解读与部署步骤

1.识别效果展示 2.视频演示 [YOLOv7]基于YOLOv7的犬只牵绳检测系统(源码&#xff06;部署教程)_哔哩哔哩_bilibili 3.YOLOv7算法简介 YOLOv7 在 5 FPS 到 160 FPS 范围内&#xff0c;速度和精度都超过了所有已知的目标检测器 并在 V100 上&#xff0c;30 FPS 的情况下达到实…

不是说人工智能是风口吗,那为什么工作还那么难找?

最近确实有很多媒体、机构渲染人工智能可以拿高薪&#xff0c;这在行业内也是事实&#xff0c;但前提是你有足够的竞争力&#xff0c;真的懂人工智能。 首先&#xff0c;人工智能岗位技能要求高&#xff0c;人工智能是一个涵盖了多个学科领域的综合性学科&#xff0c;包括数学、…

ChatGPT 使用入门

背景 ChatGPT是一个强大的聊天机器人助手&#xff0c;内置了大量的互联网知识文档&#xff0c;且具有上下文记忆&#xff0c;可以帮我们快速地查找一些资料&#xff0c;了解一个知识&#xff0c;帮我们回答问题&#xff0c;编写代码等。此外&#xff0c;在使用ChatGPT时具有一…

String类常用方法总结

目录 一.简单认识String 二.String对象的比较 1.equals 内部实现原理&#xff1a; 2.compareTo 3.compareToIgnoreCase 三.字符串查找 示例&#xff1a; 四.字符串与其他类型转化 1.数值和字符串相互转换 2.大小写相互转化 3.字符串转数组 4.格式化转化 五.字符串…

KDE 项目发布了 KDE Gear 23.08.3

导读KDE 项目发布了 KDE Gear 23.08.3&#xff0c;作为最新的 KDE Gear 23.08 开源集合的第三次维护更新&#xff0c;该集合包含了用于 KDE Plasma 桌面环境和其他平台的 KDE 应用程序。 KDE Gear 23.08.3 是在 KDE Gear 23.08.2 大约一个月之后发布的&#xff0c;包含了更多对…

数据结构-快速排序“人红是非多”?看我见招拆招

目录 1.快速排序 Hoare版本&#xff1a; 挖坑法&#xff1a; 前后指针版本: 快速排序的时间复杂度 2.快速排序的优化 三数取中法选key 随机数选key 三路划分法 3. 非递归实现快速排序 1.快速排序 快速排序一共有三种版本&#xff1a;Hoare版本、挖坑法、前后指针版本…

跑步耳机哪种好?运动耳机什么牌子好?无线运动耳机品牌排行

​运动健身已经成为当下最热门的运动健康项目&#xff0c;越来越多的人开始加入到这个行列中来。而在运动的过程中&#xff0c;佩戴一款适合自己的运动耳机听歌&#xff0c;不仅可以增加运动的乐趣&#xff0c;还能帮助我们更好地集中注意力&#xff0c;提高运动效果。然而&…

matplotlib设置y轴刻度范围【已解决】

用matplotlib绘制个一个图&#xff0c;但是y轴刻度过大&#xff0c;因为AUC本身最大值是1&#xff0c;所以现在需要修改y轴刻度 上图的代码如下 import matplotlib.pyplot as plt import numpy as np# 假设你的数据范围是0.5到1 y_ticks_range np.arange(0.5, 1.1, 0.1)# 示…

redis的一些操作

文章目录 清空当前缓存和所有缓存配置内存大小&#xff0c;防止内存饱满设置内存淘汰策略键过期机制 清空当前缓存和所有缓存 Windows环境下使用命令行进行redis缓存清理 redis安装目录下输入cmdredis-cli -p 端口号flushdb 清除当前数据库缓存flushall 清除整个redis所有缓存…

Oracle 的 Java SE、OpenJDK、Database 链接

1 访问主站 Oracle | Cloud Applications and Cloud Platform 2 开发者 2.1 OpenJDK (这里的不用登录&#xff0c;就可以下载) JDK Builds from Oracle 2.2 JavaSE (需要登录&#xff0c;才可以下载) Java Downloads | Oracle 2.3 DataBase (MySQL为例) MySQL :: MySQL Dow…

RFID读写器在物联网中的应用与优势

随着物联网技术的不断发展&#xff0c;RFID读写器作为物联网感知层的重要组成部分&#xff0c;在各个领域得到了广泛应用。本文将介绍RFID读写器在物联网中的应用及优势。 一、RFID读写器概述 RFID&#xff08;Radio Frequency Identification&#xff09;技术是一种利用无线…