这是两个英文解释边界都很模糊的单词,翻译到中文里就更让人满头雾水了。网友对这两个词的解释也是各执一词,网友在Stack Overflow 上也问过这个问题What is the difference between concurrency and parallelism?, 排名最高的解释与咱们日常接收到的一致:Parallelism(并行) 表示多个任务在同一时间同时运行,并发表示多个任务能够在不一样的时间片上执行,但某一个时刻能够只有一个任务运行。在我看来这个定义的给人的感受区别就在于CPU 是单核仍是多核,没有什么价值。二楼的网友给出了parallelism 和 concurrency 之间不一样的关键特征:Parallelism: Independentability, Concurrency: Interruptability
, 并举了四种状况的例子。golang
关键是这两个单词对咱们的开发有什么指导意义呢?从字面含义上来看彻底没有头绪,咱们设计程序时若是牵扯到多线程编程该以哪一个为指导呢?或者二者都须要考虑?(并发编程字面上含有并发,但为什么如此?并行就不须要考虑了么?)编程
Haskell 在wiki里对这二者有过一篇文章, 里面给出了解释:The term Parallelism refers to techniques to make programs faster by performing several computations at the same time. The term Concurrency refers to techniques that make programs more usable.
并行是为了提高计算速度的技术,而并发是为了使程序更合用。If you run distributed-net computations in the background while working with interactive applications in the foreground, that is concurrency. On the other hand, dividing a task into packets that can be computed via distributed-net clients is parallelism.
. Go 的发明者 Rob Pike 曾对这个作过一个 presentation Concurrency is not parallelism, 他将 concurrency 当作指导咱们编程的准则,也就是他说的Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.
咱们须要将任务一步步分解开来,在脑海中描绘完成任务所需的步骤,每一步能够是独立的也能够依赖其余的步骤。当咱们将任务步骤完成后,这个总体能够拷贝复制不少份并行执行。多线程
在单机编程中,线程是最小的执行单位,在这个维度上咱们只考虑并发对咱们的影响,由于执行是不太须要咱们关心的,OS 能够本身作好调度。在分布式系统中,单台机器变成了最小的单位,咱们不只要考虑并发,还须要考虑并行。一堆任务如何分解成一系列步骤,步骤之间多是相互依赖的,这是并发维度;这一堆任务分红不一样的组,任务之间是能够并行执行的,还须要考虑调度问题。所以并发和并行对于思惟的要求是不同的,这也是咱们在面对问题时的两种解决思路。并发