Go并发编程--通过channel实现流水线作业模型
概述
流水线作业,是多个线程协作,就像加工车间的传送带,每个线程完成一项任务,然后把结果发送给下一个线程,直到所有线程的任务完成,一个“产品”的加工过程就完成了。
通过Go的channel,可以很方便的实现流水线作业。
流水线作业的实现
在linux系统编程中,一般来说流水线作业的线程数是固定的,我们模拟的这个场景,假设有几个固定的goroutine共同协作来完成一个字符串的处理,goroutine之间通过channel来进行数据传递,各个goroutine主要进行的操作如下:
1. 第1个goroutine:一个字符串全部改成小写
2. 第2个:在该字符串前面添加HELLO: 字样
3. 第3个:统计字数,并打印字符串
当然,你可以把这些操作替换成任意你想完成的任务,就可以使用了。
代码实现
package mainimport ("fmt""os""strings""time"
)//
// 模拟流水线作业:
// 1. 一个字符串全部改成小写
// 2. 在该字符串前面添加HELLO: 字样
// 3. 统计字数,并打印字符串
//func starter(ch1 chan string) {for i := 0; i <10; i++ {v := fmt.Sprintf("HoVer: %d", i)fmt.Fprintf(os.Stderr, "starter send: %s\n", v)ch1 <- vtime.Sleep(1e9)}
}func lowString(ch1 chan string, ch2 chan string) {for {str := <- ch1res := strings.ToLower(str)ch2 <- res}
}func addString(ch2 chan string, ch3 chan string) {for {str := <- ch2res := fmt.Sprintf("HELLO: %s", str)ch3 <- res}
}func getResult(ch3 chan string) {for {v := <- ch3len := len(v)fmt.Fprintf(os.Stderr, "len=%d, result=%s\n", len, v)}
}func main() {ch := make(chan string)go starter(ch)ch1 := make(chan string)go lowString(ch, ch1)ch2 := make(chan string)go addString(ch1, ch2)go getResult(ch2)time.Sleep(100e9)
}
总结
通过channel(容量为1)的数据传递可以很方便的实现流水线的模型,这样每个goroutine就可以只专注于完成自己的那一部分任务,从而把一个复杂的任务分解成相互依赖的小任务来进行处理。
Go并发编程--通过channel实现流水线作业模型相关推荐
- golang并发编程goroutine+channel(一)
go语言的设计初衷除了在不影响程序性能的情况下减少复杂度,另一个目的是在当今互联网大量运算下,如何让程序的并发性能和代码可读性达到极致.go语言的并发关键词 "go" go dos ...
- Java并发编程 - 第三章 Java内存模型
前言: Java 线程之间的通信对程序员完全透明,内存可见性问题很容易困扰 Java 程序员,本章将揭开 Java 内存模型神秘的面纱. 一.Java 内存模型的基础 1.1 并发编程模型的两个关键问 ...
- Java并发编程的艺术笔记-Java内存模型
1.Java内存模型的基础 1.1 并发编程模型的两个关键问题 线程之间如何通信: 通信是指线程之间以何种机制来交换信息 通信机制有两种:共享内存和消息传递 线程之间如何同步: 同步:指程序中用于控制 ...
- 【并发编程】(学习笔记-共享模型之管程)-part3
文章目录 并发编程-共享模型之管程-3 1.共享带来的问题 1-1 临界区 Critical Section 1-2 竞态条件 Race Condition 2.synchronized 解决方案 2 ...
- go语言学习笔记 — 并发编程 — 通道channel(3):各种各样的通道
3.1 单向通道 在声明通道时,我们可以设置只发送或只接收.这种被约束操作方向的通道称为单向通道. 声明单向通道 只发送:chan<-,只接收:<-chan var 通道实例 chan&l ...
- Akka并发编程——第七节:Actor模型(六)
主要内容: 1. Typed Actor定义 2. Typed Actor创建 3. 消息发送 1. Typed Actor定义 Akka中的Typed Actor是Active Objects设计模 ...
- Akka并发编程——第六节:Actor模型(五)
本章主要内容: 1. !消息发送,Fire-and-Forget消息模型 2. ?消息发送,Send-And-Receive-Future消息模型 Akka提供了两种消息模型:fire-and-for ...
- Akka并发编程——第五节:Actor模型(四) 停止Actor
本节主要内容: 1. 停止Actor 1. 停止Actor (1)通过ActorSystem.shutdown方法停止所有 Actor的运行 /* *停止Actor:ActorSystem.shutd ...
- 四种并发编程模型简介
概述 并发往往和并行一起被提及,但是我们应该明确的是"并发"不等同于"并行" • 并发 :同一时间 对待 多件事情 (逻辑层面) • 并 ...
最新文章
- matlab画三维图
- WebGIS在行业中应用的演变
- MR21批量修改物料价格-BDC
- 一个半路出家的前端工程师的2018 | 掘金年度征文
- Exchange2003-2010迁移系列之九,创建DAG组
- Django的models操作
- 蓝牙芯片排行_7月TWS 全球品牌出货量排行榜出炉
- CIO启示:转向数字业务为传统IT带来颠覆性影响
- java mongo 日期范围_获取指定日期和它之前几天,之间的所有日期?千万不要踩了这个大坑!...
- python 折线图拐角平滑_python利用插值法对折线进行平滑曲线处理
- Python教学视频(一)Python基础环境的安装
- Arduino教程六—DS1302时钟模块
- 逃跑h5小游戏源码熊出没手机游戏
- Android8.0以上,打开uiautomatorviewer.bat,报错Unexpected error while obtaining Ul hierarchy
- 收录拒绝指定ip请求黑名单lua脚本、拒绝ip频次请求的lua脚本
- HDU 6148 Valley Numer(数位DP)
- linux挂载的硬盘为ro,remount成rw出错问题解决
- 【图文详解】HBase 的数据模型与架构原理详解
- mysql能不能存储图片_韩魔方视频app下载免费_电脑知识学习网
- 为什么Vue(默认情况下)比React性能更好
热门文章
- 何恺明:从高考状元到CV领域年轻翘楚,靠“去雾算法”成为“CVPR最佳论文”首位华人得主...
- 自学js第六天:JS数组和算法
- 蒋涛作序盛赞Leo新作为 程序员职场实用百科全书 —— 程序员羊皮卷 连载 1
- Q4财报一如既往增长稳健 陌陌为何能逆势增长?
- Android播放视频快进帧预览图完美解決方案
- 自动化测试appium
- Java中比较数字的大小
- 第3.1章 卷积神经网络(CNN)——Conv、Pool、FC、Activation Function、BN各个层的作用及原理
- 苹果乔布斯靠它爆红;IBM创始人靠它发家,这项技术是如何发展起来的?|科技拾遗...
- python b站动态转发、动态评论区抽奖(已打包成exe,可以下载食用)