阅读更多

11顶
6踩

编程语言

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

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

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

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 条 请登录后发表评论
4 楼 hardPass 2014-03-28 15:03
那是Gopher啊
3 楼 freezingsky 2014-03-28 14:09
dohkoos 写道
并行是物理的,并发是逻辑的。
并行是和串行对立。

总结很到位!
2 楼 satuo20 2014-03-28 13:45
照我理解,在编程语言里面,一般只说并发,和并行其实一个意思。就是同时处理,而不相互依赖(当然也有依赖,如线程间通信等)。区分这东西感觉有点八古了,真心没必要。。。
1 楼 dohkoos 2014-03-28 13:17
并行是物理的,并发是逻辑的。
并行是和串行对立。

发表评论

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

相关推荐

  • 并发不是并行 它更好!

    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() { ...

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

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

  • 原生js图片圆形排列按钮控制3D旋转切换插件.zip

    原生js图片圆形排列按钮控制3D旋转切换插件.zip

Global site tag (gtag.js) - Google Analytics