Go语言中文网,致力于每日分享编码、开源等知识,欢迎关注我,会有意想不到的收获!

Golang作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,它有多种并发模型,通过流水线模型系列文章,你会更好的使用Golang并发特性,提高你的程序性能。

这篇文章主要介绍流水线模型的流水线概念,后面文章介绍流水线模型的FAN-IN和FAN-OUT,最后介绍下如何合理的关闭流水线的协程。

Golang的并发核心思路

Golang并发核心思路是关注数据流动。数据流动的过程交给channel,数据处理的每个环节都交给goroutine,把这些流程画起来,有始有终形成一条线,那就能构成流水线模型。

但我们先从简单的入手。

从一个简单的流水线入手

流水线并不是什么新奇的概念,它能极大的提高生产效率,在当代社会流水线非常普遍,我们用的几乎任何产品(手机、电脑、汽车、水杯),都是从流水线上生产出来的。以汽车为例,整个汽车流水线要经过几百个组装点,而在某个组装点只组装固定的零部件,然后传递给下一个组装点,最终一台完整的汽车从流水线上生产出来。

Golang的并发模型灵感其实都来自我们生活,对软件而言,高的生产效率就是高的性能。

在Golang中,流水线由多个阶段组成,每个阶段之间通过channel连接,每个节点可以由多个同时运行的goroutine组成。

从最简单的流水线入手。下图的流水线由3个阶段组成,分别是A、B、C,A和B之间是通道aCh,B和C之间是通道bCh,A生成数据传递给B,B生成数据传递给C。

流水线中,第一个阶段的协程是生产者,它们只生产数据。最后一个阶段的协程是消费者,它们只消费数据。下图中A是生成者,C是消费者,而B只是中间过程的处理者。

举个例子,设计一个程序:计算一个整数切片中元素的平方值并把它打印出来。非并发的方式是使用for遍历整个切片,然后计算平方,打印结果。

我们使用流水线模型实现这个简单的功能,从流水线的角度,可以分为3个阶段:

  1. 遍历切片,这是生产者。
  2. 计算平方值。
  3. 打印结果,这是消费者。

下面这段代码:

  • producer()负责生产数据,它会把数据写入通道,并把它写数据的通道返回。
  • square()负责从某个通道读数字,然后计算平方,将结果写入通道,并把它的输出通道返回。
  • main()负责启动producer和square,并且还是消费者,读取suqre的结果,并打印出来。

结果:

➜ awesome git:(master) ✗ go run hi.go 1 4 9 16

这是一种原始的流水线模型,这种原始能让我们掌握流水线的思路。

流水线的特点

  1. 每个阶段把数据通过channel传递给下一个阶段。
  2. 每个阶段要创建1个goroutine和1个通道,这个goroutine向里面写数据,函数要返回这个通道。
  3. 有1个函数来组织流水线,我们例子中是main函数。

如果你没了解过流水线,建议自己把以上的程序写一遍,如果遇到问题解决了,那才真正掌握了流水线模型的思路。

完整示例代码

本文所有代码都在仓库,可查看完整示例代码:https://github.com/Shitaibin/golang_pipeline_step_by_step

原文链接:http://lessisbetter.site/2018/11/16/golang-introduction-to-pipeline/

本系列作者:大彬,原创授权发布

blp模型 上读下写_Golang 并发模型系列:1. 轻松入门流水线模型相关推荐

  1. blp模型 上读下写_Java高并发编程(三):Java内存模型

    1 Java内存模型的基础 在并发编程里,需要处理两个问题: 线程之间如何通信 线程之间如何同步. 通信指的是线程之间以何种机制来交换信息.在命令式编程里中,线程之间的通信机制有两种:共享内存和消息传 ...

  2. blp模型 上读下写_读写模型整理笔记

    读模型 1.主键读 最常见的读模型,说是主键,其实也包括其它索引键,或者联合主键. 常见实现:hash,时间复杂度可以接近 O(1):B 树或变种:时间复杂度接近 O(log(n)). 关于 B 树和 ...

  3. blp模型 上读下写_CreditX在线借贷欺诈检测框架BLP

    本次介绍的文章是来自于氪信科技的<Behavior Language Processing with Graph based Feature Generation for Fraud Detec ...

  4. 如何在golang中关闭bufio.reader_Golang 并发模型系列:1. 轻松入门流水线模型

    Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获! Golang作为一个实用主义的编程语言,非常注重性能,在语言特性上天然支持并发,它有多种并发模型,通过流水线模型系列文 ...

  5. Golang并发模型:轻松入门流水线FAN模式

    前一篇文章<Golang并发模型:轻松入门流水线模型>,介绍了流水线模型的概念,这篇文章是流水线模型进阶,介绍FAN-IN和FAN-OUT,FAN模式可以让我们的流水线模型更好的利用Gol ...

  6. python打九九乘法表上三角下三角_Python-零基础自学系列之九九乘法表、打印菱形、打印对顶三角形、打印闪电、斐波拉契数列、素数...

    刚开学学习简单的练习,学到后面会有越来越多的解法来写! 作业的目的是为了让大家熟悉程序语言,锻炼将思路转换成程序逻辑. 九九乘法表 help(print) 先思考能不能打印出方阵 # 1 方阵 # 1 ...

  7. 跑yolo3模型出的效果图_【目标检测实战】Darknet入门—yolov3模型训练(Win10下的安装、编译、实现)...

    效果图 简介 Yolo,是实时物体检测的算法系统,基于Darknet-一个用C和CUDA编写的开源神经网络框架.它快速,易于安装,并支持CPU和GPU计算,也是yolo的底层.本文主要介绍在win10 ...

  8. python多因子量化选股模型_【邢不行|量化小讲堂系列12-Python量化入门】法码三因子选股模型,有多少人可以跑赢...

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. 个人微信:xingbuxing0807,有问题欢迎 ...

  9. Golang并发模型:轻松入门协程池

    goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理.但有时候,我们还是想控制一下. 比如,我们有A.B两类工作,不想把太多资源花费在B类务上,而 ...

最新文章

  1. 详解log4j2(下) - 按日志级别区分文件输出
  2. 没有活动混音器设备可用的解决方法
  3. html语言入门测试题,Web前端:20道非常基础的JavaScript测试题
  4. Datawhale组队-Pandas(下)分类数据(打卡)
  5. 他无意间玩了这12个游戏,却掌握了Python基础,前后只用了一个月
  6. linux搭建测试环境常见问题,在Linux环境下搭建CCID测试环境
  7. 程序员心声:我为什么偏爱苹果电脑和Mac OS X
  8. “很多人,到了一定年龄才明白:不要与任何人走的太近”你怎么看?
  9. 知识分享 | IEC FMEA手册 附录A.1摘录
  10. 北大医学英语和计算机,医学英语专业本科生张泉同学在SSCI期刊发表论文
  11. 记录阿里技术面试全流程
  12. 新路由3 newifi3 官方固件与离线插件合集
  13. vue 中使用 pug
  14. c++随笔——隐藏窗口
  15. shibor与沪深300指数的相关性图示
  16. Ubuntu搜狗拼音输入法安装教程(常识)
  17. gms认证流程_谷歌GMS测试认证具体流程
  18. 怎么录屏?5 款免费无水印的录屏神器
  19. HTML+CSS第十课:常见的3种网页布局方式:表格布局、DIV+CSS布局、框架布局
  20. [数据库] mysql

热门文章

  1. fastjson jar包_Fastjsonlt;=1.2.47反序列化RCE漏洞(CNVD201922238)
  2. php 赋予最高权限,为PHP执行赋予root权限(一)
  3. git 生成多个patch_如何用git命令生成Patch和打Patch
  4. Android开发中EditText获得焦点弹出输入框改变屏幕布局的问题
  5. Android开发之The application could not be installed: INSTALL_FAILED_VERSION_DOWNGRADE报错
  6. golang sdk后端怎么用_Python比Golang慢多少?实际上两者差异并不大
  7. iOS coredata 多表查询
  8. mysql多线程查询_MySQL 利用多线程提升查询性能的一种思路
  9. python init函数可以外部调用么,如何从python类中调用外部函数
  10. 【python】用正则表达式进行文字局部替换