• 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


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


    在这里插入图片描述

    • 原创作者: 猫头虎

    • 作者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 { /* ... */ }
    
    • 1
    • 2

    并行处理:扇出和扇入 🔄

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

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

    提前停止 🛑

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

    明确的取消机制 🚫

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

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

    处理树形结构的数据 🔍

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

    并行化的限制 🔗

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

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

    总结

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

    参考资料

    currency-patterns)

    下一篇预告

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


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

    在这里插入图片描述

    原创声明

    ======= ·

    • 原创作者: 猫头虎

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

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

    在这里插入图片描述

    学习复习Go生态

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

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

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

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

    感谢您的支持与尊重。

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

  • 相关阅读:
    Docker镜像分层
    Python居然开始抄作业了,这次抄的是Rust
    【(数据结构)—— 基于单链表实现通讯录】
    [免费专栏] Android安全之Android工程模式
    c++ 11 多线程支持 (std::future)
    Dubbo高手之路3,Dubbo服务消费详解
    图像分类单张图片预测准确率达到百分之百
    MySQL 核心模块揭秘 | 15 期 | 事务模块小结
    车载网络安全指南 概述(一)
    云原生:Docker 实践经验(六)-镜像的使用及分层讲解
  • 原文地址:https://blog.csdn.net/qq_44866828/article/details/134550589