阅读更多

11顶
6踩

编程语言

转载新闻 并发不是并行,它更好!

2014-03-28 11:27 by 副主编 WnouM 评论(24) 有19771人浏览
并发与并行是两个既相似而又不相同的概念,但往往容易混为一谈,这两者究竟有什么区别呢?本文通过一个例子让你更好地理解(本文由并发编程网翻译)。

现代社会是并行的:多核、网络、云计算、用户负载,并发技术对此有用。

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服务的并发设计了。

文章出处:原文链接 / 译文链接 / 译者:蒋健雷
  • 大小: 28.5 KB
  • 大小: 30.3 KB
  • 大小: 32 KB
  • 大小: 45.5 KB
  • 大小: 30 KB
  • 大小: 39.2 KB
  • 大小: 65.8 KB
  • 大小: 44.7 KB
  • 大小: 58.2 KB
  • 大小: 33.7 KB
  • 大小: 54.8 KB
来自: 并发编程网
11
6
评论 共 24 条 请登录后发表评论
24 楼 frankytony 2015-12-16 17:14
确实差, 一张图就能说明的问题, 搞那么多废话迷惑人
23 楼 步青龙 2015-12-11 12:46
文章很不错额,是翻译的,并行或许可简单理解,最好是不同的Server上去理解他,但是以进程的理解也是可以,可以这样理解:“并发在不同Server上在同一时间点处理不同的业务”,而并发只运行在单个计算机进程中,并行更多的是达到汇总的结果。并发如排队(也可以插队的),并行不需要排队,因为他们大多数是在不同计算机上运行,所以可以是同一个时间点。
22 楼 fjjiaboming 2014-06-29 13:52
绕个大圈...
Concurrent + Parallel  不翻译不就好了...
21 楼 fjjiaboming 2014-06-29 13:50
xiaokek 写道
并发:
任务1-------------------↘
                          总资源
任务2-------------------↗

并行:
任务1------------------->资源1
任务2------------------->资源2

20 楼 young7 2014-06-27 13:13
dohkoos 写道
并行是物理的,并发是逻辑的。
并行是和串行对立。

对,就是这个观点,不明白为何上面洋洋洒洒写了这么多并且还没解释清楚
19 楼 xiaokek 2014-04-06 16:47
xiaokek 写道
并发:
任务1-------------------↘
                                        总资源
任务2-------------------↗

并行:
任务1------------------->资源1
任务2------------------->资源2

18 楼 xiaokek 2014-04-06 16:47
并发:
任务1-------------------↘
                          总资源
任务2-------------------↗

并行:
任务1------------------->资源1
任务2------------------->资源2
17 楼 zagfai 2014-04-01 14:54
这文章质量... 只能说... 很差...
16 楼 flex_莫冲 2014-04-01 10:09
深入浅出。
15 楼 Tyrion 2014-04-01 09:25
iteye文章的水平能不能再高点?
14 楼 qq122343779 2014-04-01 09:22
dohkoos 写道
并行是物理的,并发是逻辑的。
并行是和串行对立。

 
醍醐灌顶了!谢谢
13 楼 cucaracha 2014-03-31 22:51
两者的区别:并发是同时处理(dealing)很多相同的事情,并行是同时做(doing)很多不同的事情。
12 楼 t42dw 2014-03-31 16:54
重算是搞懂了..哈哈..写的真好
11 楼 jackra 2014-03-31 16:26
这图是怎么画出来的?
10 楼 taoge2121 2014-03-31 10:25
写的挺好的!
9 楼 jacktom 2014-03-30 11:12
这文章翻译的...“两者的区别:并发是同时处理(dealing)很多的事情,并行是同时做(doing)很多的事情。”这句话把区别表现出来了吗?
8 楼 snow8261 2014-03-29 10:42
深入理解计算机系统中的定义:并发指同时具有多个活动的系统,并行是使用并发使系统运行的更快。并发是我们像要达到的结果,而并行是手段。并发的手段有线程级并发,偏高级。并行是指指令集并行以及单指令,多数据并行,偏底层。
7 楼 fjjiaboming 2014-03-29 08:31
dohkoos 写道
并行是物理的,并发是逻辑的。
并行是和串行对立。
 
6 楼 kevinjun 2014-03-28 17:52
5 楼 至尊宝_唯一 2014-03-28 16:48
在编程语言中无所谓吧

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 并发不是并行,它更好!

    并发不是并行,它更好!.现代社会是并行的:多核、网络、云计算、用户负载,并发技术对此有用。Go语言支持并发,它提供了:并发执行(goroutines),同步和消息(channels)和多路并发控制(select)。  现代社会是并行的...

  • 并发不是并行 它更好!

    Go语言支持并发,它提供了:并发执行(goroutines),同步和消息(channels)和多路并发控制(select)。 当Go声称是并发时,人们说:“并发很酷!耶,我可以并行运行了!”,但这是个错误的。因为很多人都不了解...

  • 《性能优化》并发与并行

    5、并发并行适用于哪种场景 典型的适合使用并发并行的场景通常有以下特点: 1)存在I/O操作,并且I/O操作有多次,最典型的就是RPC调用和查询数据库 2)I/O操作比较耗时,越耗时越有优化价值 3)多次I/O操作之间没有...

  • 并发和并行及多线程基本概念

    并发 并行 同步 异步 多线程

  • 并行和并发的区别

    并行和并发的区别

  • 并行和并发哪个好?并行和并发的概念和区别

    摘要:并发与并行是两个既相似而又不相同的概念:并发性,又称共行性,是指能处理多个同时性活动的能力;并行是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行,也亦是说并发事件之间不一定要同一...

  • 高并发(1)-并发与并行的区别

    说到高并发,那么就要先理解一件事情,那就是并发跟并行的区别,接下来便讲讲两者的区别。 一、并发 说到并发,什么是并发呢?先举个例子来说明一下吧。 比如生活中常见的咖啡机。 现在有一台咖啡机在售卖咖啡...

  • 架构之:并发和并行

    在现代程序中,我们经常会使用到两个关键词:并发*concurrency*和并行*parallelism*,虽然两者的英文单词区别很大,但是翻译成中文之后几乎是一样的。虽然中文以其优美的语法和工整的写法凌驾于英语之上,但是带来的...

  • JAVA高并发(一)——了解并行世界

    最近不知道怎么了,感觉什么东西都需要画画图,梳理梳理思路、写写,而且每每晚上坐到自己的位置上,打开本书,打开篇文章...今天开始把Java高并发多线程的知识也回顾整理一吧。  以前学习高并发多线程的过程,现...

  • Java的并行与并发

    并行性和并发性是既相似又有区别的两个概念。 并行性是指两个或多个事件在同一时刻发生。 而并发性是指连个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行...

  • 【操作系统】进程、线程、协程和并发、并行

    线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。 一个进程可以创建和撤销多个线程;同一个进程中的多个线程之间可以并发执行。 2. 并发和并行 并发和并行最开始都是...

  • fastapi python 并发_FastAPI 异步代码、并发和并行

    我们这里探讨下关于异步代码、并行和并发的一些概念。一、初探1、如果我们使用必须用await调用的第三方库,例如:results = await some_library()那么我们就要用async def来定义路径操作函数:@app.get('/')...

  • 程序 进程 线程 并发 并行

    程序 进程 线程 并发 并行 程序(program) : 是为完成特定任务、用某种语言编写的一组指令的集合,是一段静态的代码(程序是静态的) 进程(process) : 是操作系统对一个正在运行的程序的一种抽象。在一个系统上...

  • 关于并发和并行,Go和Erlang之父都弄错了?

    并行和并发需要的是不同的工具,而对单个工具来说,并行和并发不可兼得。

  • golang 并发与并行

    并发(concurrency)不是并行(parallelism) 。并行是让不同的代码片段同时在不同的物理处理器上执行。并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了。...

  • 并发、并行和协程

    几乎所有’正式’的程序都是多线程的,以便让用户或计算机不必等待,或者能够同时服务多个请求(如 Web 服务器),或增加性能和吞吐量(例如,通过对不同的数据集并行执行代码)。 并发和...

  • Go语言并发与并行

    首先,并行!=并发, 两者是不同的 Go语言的goroutines、信道和死锁 goroutine Go语言中有个概念叫做goroutine, 这类似我们熟知的线程,但是更轻。 以下的程序,我们串行地去执行两次loop函数: func loop() { ...

  • 全面理解:在计算机科学中同步、异步、并行、并发,他们之间到底有什么区别,如果正确更好的区分它们?

    也就是说,在开始一个同步操作后,你必须等待它完成,然后才能开始执行另一个操作。例如,如果你在程序中进行网络请求,同步操作会使程序等待请求的结果,然后才继续执行。如果网络请求耗时较长,这可能导致程序在...

  • node-v10.17.0-linux-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics