概述

流水线作业,是多个线程协作,就像加工车间的传送带,每个线程完成一项任务,然后把结果发送给下一个线程,直到所有线程的任务完成,一个“产品”的加工过程就完成了。
通过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实现流水线作业模型相关推荐

  1. golang并发编程goroutine+channel(一)

    go语言的设计初衷除了在不影响程序性能的情况下减少复杂度,另一个目的是在当今互联网大量运算下,如何让程序的并发性能和代码可读性达到极致.go语言的并发关键词 "go" go dos ...

  2. Java并发编程 - 第三章 Java内存模型

    前言: Java 线程之间的通信对程序员完全透明,内存可见性问题很容易困扰 Java 程序员,本章将揭开 Java 内存模型神秘的面纱. 一.Java 内存模型的基础 1.1 并发编程模型的两个关键问 ...

  3. Java并发编程的艺术笔记-Java内存模型

    1.Java内存模型的基础 1.1 并发编程模型的两个关键问题 线程之间如何通信: 通信是指线程之间以何种机制来交换信息 通信机制有两种:共享内存和消息传递 线程之间如何同步: 同步:指程序中用于控制 ...

  4. 【并发编程】(学习笔记-共享模型之管程)-part3

    文章目录 并发编程-共享模型之管程-3 1.共享带来的问题 1-1 临界区 Critical Section 1-2 竞态条件 Race Condition 2.synchronized 解决方案 2 ...

  5. go语言学习笔记 — 并发编程 — 通道channel(3):各种各样的通道

    3.1 单向通道 在声明通道时,我们可以设置只发送或只接收.这种被约束操作方向的通道称为单向通道. 声明单向通道 只发送:chan<-,只接收:<-chan var 通道实例 chan&l ...

  6. Akka并发编程——第七节:Actor模型(六)

    主要内容: 1. Typed Actor定义 2. Typed Actor创建 3. 消息发送 1. Typed Actor定义 Akka中的Typed Actor是Active Objects设计模 ...

  7. Akka并发编程——第六节:Actor模型(五)

    本章主要内容: 1. !消息发送,Fire-and-Forget消息模型 2. ?消息发送,Send-And-Receive-Future消息模型 Akka提供了两种消息模型:fire-and-for ...

  8. Akka并发编程——第五节:Actor模型(四) 停止Actor

    本节主要内容: 1. 停止Actor 1. 停止Actor (1)通过ActorSystem.shutdown方法停止所有 Actor的运行 /* *停止Actor:ActorSystem.shutd ...

  9. 四种并发编程模型简介

    概述 并发往往和并行一起被提及,但是我们应该明确的是"并发"不等同于"并行" •       并发 :同一时间 对待 多件事情 (逻辑层面) •       并 ...

最新文章

  1. matlab画三维图
  2. WebGIS在行业中应用的演变
  3. MR21批量修改物料价格-BDC
  4. 一个半路出家的前端工程师的2018 | 掘金年度征文
  5. Exchange2003-2010迁移系列之九,创建DAG组
  6. Django的models操作
  7. 蓝牙芯片排行_7月TWS 全球品牌出货量排行榜出炉
  8. CIO启示:转向数字业务为传统IT带来颠覆性影响
  9. java mongo 日期范围_获取指定日期和它之前几天,之间的所有日期?千万不要踩了这个大坑!...
  10. python 折线图拐角平滑_python利用插值法对折线进行平滑曲线处理
  11. Python教学视频(一)Python基础环境的安装
  12. Arduino教程六—DS1302时钟模块
  13. 逃跑h5小游戏源码熊出没手机游戏
  14. Android8.0以上,打开uiautomatorviewer.bat,报错Unexpected error while obtaining Ul hierarchy
  15. 收录拒绝指定ip请求黑名单lua脚本、拒绝ip频次请求的lua脚本
  16. HDU 6148 Valley Numer(数位DP)
  17. linux挂载的硬盘为ro,remount成rw出错问题解决
  18. 【图文详解】HBase 的数据模型与架构原理详解
  19. mysql能不能存储图片_韩魔方视频app下载免费_电脑知识学习网
  20. 为什么Vue(默认情况下)比React性能更好

热门文章

  1. 何恺明:从高考状元到CV领域年轻翘楚,靠“去雾算法”成为“CVPR最佳论文”首位华人得主...
  2. 自学js第六天:JS数组和算法
  3. 蒋涛作序盛赞Leo新作为 程序员职场实用百科全书 —— 程序员羊皮卷 连载 1
  4. Q4财报一如既往增长稳健 陌陌为何能逆势增长?
  5. Android播放视频快进帧预览图完美解決方案
  6. 自动化测试appium
  7. Java中比较数字的大小
  8. 第3.1章 卷积神经网络(CNN)——Conv、Pool、FC、Activation Function、BN各个层的作用及原理
  9. 苹果乔布斯靠它爆红;IBM创始人靠它发家,这项技术是如何发展起来的?|科技拾遗...
  10. python b站动态转发、动态评论区抽奖(已打包成exe,可以下载食用)