并发不是并行,它更好!
原文链接,译文链接,译者:雷哥,饶命,校对:李任
现代社会是并行的:多核、网络、云计算、用户负载,并发技术对此有用。
Go语言支持并发,它提供了:并发执行(goroutines),同步和消息(channels)和多路并发控制(select)。
当Go声称是并发时,人们说:“并发很酷!耶,我可以并行运行了!”,但这是个错误的。因为很多人都不了解他们间的差别。“我用四个处理器来做质数筛选,但是更慢了。”
并发(Concurrency):以可独立执行的进程集合的方式编程(进程是出了名的难定义,这里是通常意义上的进程,不是Linux进程)
并行(Parallelism):以可同时执行的(可能相关的)计算指令方式编程。
两者的区别:并发是同时处理(dealing)很多的事情,并行是同时做(doing)很多的事情。不同,但也相关。一个是关于代码结构,一个是关于代码执行。并发为可能的(不是必须的)并行问题提供了一种解决方案。
一个类比:
鼠标、键盘、显示器、磁盘驱动是并发结构的。
向量点积是并行的。
并发带有通信:
并发是一种构造程序的方式,把任务分解为一个个独立运行的小任务。通信是协调这些小任务的手段。
Go的模型(还有Erlang等)都是基于CPS(Communicating sequential processes, 通信顺序进程):其论文C. A. R. Hoare: Communicating Sequential Processes (CACM 1978)
以上讲得太抽象了,我们举实际点的例子。
我们的问题:把一堆废弃语言的说明书运到火炉里,一只地鼠会花费很长时间。
更多的地鼠
单单更多的地鼠也不解决问题,它们需要更多的推车。
更多的地鼠、更多的推车
这样会加快速度,但它们会在那堆书和炉子那边遇上瓶颈。同时也要同步两只地鼠,可以通过消息的方式实现。
全部加倍
这样会以两倍的速度运送。这是两个地鼠程序的并发构成(concurrent composition)。
但这种设计不是自发并行的,如果一次只有一只地鼠在运会怎样?
这种设计仍是并发,不是并行。[译者注:一只地鼠运一次上面那堆书,然后第二只地鼠再运一次下面那堆书。一次只允许一只地鼠运送,这样就不是并行的。]
然而,这种场景是可以自发并行的。并发构成可以考虑下其他模型。
另一种设计
三只地鼠在工作,但可能会有延误。每只地鼠是个独立的步骤,附加协调(通信)。
更细粒度的并发
增加一只地鼠用来运回空推车。四只地鼠在工作,运行得更加流畅,每只地鼠都在做一个简单的任务。
如果我们把事情安排的足够好(现实中很难但不是不可能),速度会是最先只有一只地鼠的那个设计的四倍。
观察结论:我们在一个已有的设计(指三个地鼠的那个设计)中添加一个并发的步骤(第四只地鼠)增强了系统的性能。更多的地鼠干了更多的活,系统运行得更好。并发比简单的并行对问题要有更深的洞察。
我们有四个并发的步骤:1.装书到推车上2.把推车运到火炉边3.把书卸到火炉里4.运回空推车
不同的并发设计能以不同的方式来并行。
更多的并行
我们以另一个维度来并行,并行使这样的设计变的容易。八只地鼠,都在繁忙工作。
但也可能根本没有并行
谨记:即使一次只能有一只地鼠在工作(零并行),这也不失为一个良好的并发的解决方案。
另一种设计
下面也是一种用并发组成来解决问题的设计。两只地鼠,再加上一个中转堆。
以一般的方式来并行
用更多的并发程序来提高吞吐量
或者一种不同的方式
在多地鼠并发模型中引入中转堆
全面优化
使用我们所有的技术,16只地鼠都开足马力。
学到内容
我们有很多方法把问题分解,这才是并发设计。一旦我们分解了问题,并行就自然而然的产生了,正确性也变得很容易。
回到计算
我们关于运书的问题,可以看做是如下的类比:书堆是Web数据,地鼠是CPU,推车是调度、渲染或是网络,火堆是代理、浏览器或是其他的消费者。地鼠提供网络数据,这就是一个可扩展的Web服务的并发设计了。
并发不是并行,它更好!相关推荐
- 一文搞明白Python并发编程和并行编程
目录 前言 一.基础知识 1.并行和并发 (1)定义 (2)联系 2.进程.线程和协程 (1)定义 (2)联系 3.生成器 (1)yield (2)send, next (3)yield from 4 ...
- 并发(Concurrent) 与并行(Parallel) 的区别
刚开始阅读 <Akka IN ACTION>这本书,刚开始是对 Revolution 这个词翻译成中文是革命 感到诧异,因为革命 通俗来讲就是 杀人 的意思.至于 Revolution 英 ...
- JAVA高并发(一)——了解并行世界
最近不知道怎么了,感觉什么东西都需要画画图,梳理梳理思路.写写,而且每每晚上坐到自己的位置上,打开本书,打开篇文章,打开思维导图,打开onenote,再打开音乐,然后就开始静静理解着,梳理着,画图着, ...
- 并发(Concurrent)与并行(Parallel)的区别
并发和并行的区别就是一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务. 前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生. 来个比喻:并发和并 ...
- 并发与并行概念认知(并发性不是并行性(并行性更好))
并发和并行是程序重要概念,也是一种解决问题的思路.在golang创始人rob pike的演讲Concurrency is not Parallelism (it's better)举例花枝鼠烧书的例子 ...
- 并发 vs 并行 (Concurrency Is Not Parallelism)
前言 不知你是否曾经下列这些疑问? 并发与并行性有何关系? 什么是同步和异步执行? 如何区分并发与并行? 线程如何与所有这些概念一起使用? 并发 并发性意味着应用程序同时(并发地)在多个任务上取得进展 ...
- 进程、线程、进程池、进程三态、同步、异步、并发、并行、串行
点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源:cnblogs.com/songhaixing/p/1 ...
- 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!
作者:Martin cnblogs.com/mhq-martin/p/9035640.html 基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运 ...
- 并发、并行、串行、同步、异步、阻塞、非阻塞
并发.并行.串行.同步.异步.阻塞.非阻塞 实际上同步与异步是针对应用程序与内核的交互而言的. 同步过程中进程触发IO操作并等待(也就是我们说的阻塞)或者轮询的去查看IO操作(也就是我们说的非阻塞)是 ...
最新文章
- CODEFORCES 484E Sign on Fence
- 图.exe 已触发了一个断点。 出现了_学术简报︱基于保护综合重要度的最小断点集优选方法...
- 成功解决absl.flags._exceptions.IllegalFlagValueError: flag --train_size=inf: Expect argument to be a str
- Paddle.js PaddleClas 实战 ——『寻物大作战』AI 小游戏
- python-演练-通过描述符来控制另一个类的实例化参数
- Maven系列(一):maven基础入门
- mysql中merge的用法_mysql中merge表存儲引擎用法介紹
- Apache启用GZIP压缩网页传输方法
- Mysql net start mysql启动,提示发生系统错误 5 拒绝訪问 解决之道
- Puppet File资源介绍(贰拾)
- Unity接入Facebook SDK--android篇
- 一文看懂码灵半导体CFW32C7UL系列产品应用(八):扫码设备应用(上)
- 增值税发票开票软件卷票打印错位配置修正指南
- 黑屏出现An operating system wasn't found.解决方案
- 简单有趣的互动小游戏介绍:好玩的密室脱逃H5互动小游戏
- js实现A页面带数据跳转B页面并返回上一层
- 分布式存储开发:Curve中的内存管理
- 1 实验9_7_设计函数int getVowel(char str[],char vowel[]); (100分)
- 【决策树算法】泰坦尼克号乘客生存预测
- HCIP-H12-221单选题库(5)
热门文章
- C#中几种常用的集合的用法
- c#进阶(4)—— Redis 用于消息队列的存储
- ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求
- 41状态模式(State Pattern)
- 【转】3.4SharePoint服务器端对象模型 之 访问文件和文件夹(Part 4)
- 一步步编写操作系统 2 部署工作环境 2
- php 版权信息自动变化,php自动更新版权信息显示的方法
- uniapp动态修改样式_uniapp样式动态绑定
- REVERSE-PRACTICE-CTFSHOW-8
- CCNP-第十四篇-BGP综合实验