并发和并行之间的区别是什么?
当前回答
(我很惊讶这样一个根本问题多年来都没有得到正确和巧妙的解决……)
简而言之,并发性和并行性都是计算的财产。
至于区别,以下是罗伯特·哈珀的解释:
首先要理解的是并行性与并发无关。并发与程序(或其组件)的不确定性组成有关。并行性与具有确定性行为的程序的渐近效率有关。并发是关于管理不可管理的事件:事件的发生是出于我们无法控制的原因,我们必须对此做出反应。用户单击鼠标时,窗口管理器必须做出响应,即使显示需要注意。这种情况本质上是不确定性的,但我们也在确定性设置中采用形式上的不确定性,假装组件以任意顺序发出事件信号,并且我们必须在事件发生时对其作出响应。非确定性组合是一种强大的程序结构思想。另一方面,并行性是关于确定性计算的子组之间的依赖性。其结果毋庸置疑,但有许多方法可以实现,有些方法比其他方法更有效。我们希望充分利用这些机会。
它们可以是程序中的各种正交财产。阅读此博客文章以获取更多插图。这篇文章稍微讨论了编程中组件的差异,比如线程。
注意,线程或多任务都是为更具体的目的服务的计算实现。它们可以与并行性和并发性相关,但不是以一种基本的方式。因此,它们很难成为开始解释的好条目。
还有一个亮点:(物理)“时间”几乎与这里讨论的财产无关。时间只是一种衡量实施的方式,以显示财产的重要性,但远非本质。仔细考虑一下“时间”在时间复杂性中的作用——这或多或少是相似的,即使在这种情况下,度量也往往更重要。
其他回答
“并发”是指有多件事情正在进行。
“并行性”是指并发的事情同时进行。
没有并行性的并发示例:
单个内核上有多个线程。Win32消息队列中有多条消息。MARS连接上有多个SqlDataReader。浏览器选项卡中有多个JavaScript承诺。
然而,请注意,并发性和并行性之间的区别通常是一个视角问题。从执行代码(可观察到的效果)的角度来看,上述示例是非并行的。但即使在单个内核中也存在指令级并行性。有一些硬件与CPU并行工作,然后在完成时中断CPU。在执行窗口过程或事件处理程序时,GPU可能正在绘制到屏幕。当您仍然获取上一个查询的结果时,DBMS可能正在为下一个查询遍历B树。执行Promise.resolve()时,浏览器可能正在进行布局或联网。等等。。。
好了。世界一如既往地混乱;)
并发简单意味着多个任务正在运行(不需要并行)。例如,假设我们在任何时刻都有3个任务:多个任务可能正在运行,或者所有任务可能同时运行。
并行性意味着它们实际上是并行运行的。因此,在这种情况下,三者必须同时运行。
同意:具有共享资源潜力的多个执行流
前任:两个线程竞争I/O端口。
视差:将问题分成多个相似的块。
前任:通过对文件的每一半运行两个进程来解析大文件。
我非常喜欢Paul Butcher对这个问题的回答(他是《七周内的七个并发模型》的作者):
虽然它们经常被混淆,但并行性和并发性是不同的事情。并发性是问题域的一个方面代码需要同时处理多个(或接近同时)事件。相反,并行性是解决方案的一个方面您希望通过处理使程序运行更快的域并行处理问题的不同部分。有些方法是适用于并发,有些适用于并行,有些则适用于两者。了解您面临的问题,并选择合适的工具工作
想象一下,通过观看视频教程学习一种新的编程语言。你需要暂停视频,应用代码中所说的内容,然后继续观看。这就是并发性。
现在你是一名职业程序员了。你喜欢在编码时听平静的音乐。这就是平行主义。
正如Andrew Gerrand在GoLang博客中所说
并发是指同时处理许多事情。相似一次做很多事情。
享受