如何阐明异步和并行编程之间的区别?

Mat*_*man 129 parallel-processing multithreading asynchronous

许多平台都提倡异步和并行作为提高响应能力的手段.我一般都了解这种差异,但经常发现很难在我自己的心中以及其他人中表达出来.

我是一名工作日程序员,经常使用异步和回调.并行感觉异国情调.

但我觉得他们很容易混淆,特别是在语言设计层面.希望能够清楚地描述它们之间的关系(或不关联),以及各自最佳应用的程序类别.

小智 82

当你异步运行它意味着它是非阻塞的时,你执行它而不等待它完成并继续其他的事情.并行性意味着并行地同时运行多个事物.当您可以将任务分成独立的工作时,并行性很有效.

例如,渲染3D动画的帧.要渲染动画需要很长时间,因此如果您要从动画编辑软件中启动渲染,则可以确保它是异步运行的,因此它不会锁定您的UI,您可以继续执行其他操作.现在,该动画的每个帧也可以被视为一个单独的任务.如果我们有多个CPU /核心或多个机器可用,我们可以并行渲染多个帧以加速整体工作负载.


igo*_*gon 63

我认为主要的区别在于并发性并行性.

异步回调通常是表达并发性的一种方式(工具或机制),即一组可能相互通信并共享资源的实体.在异步或回调的情况下,通信是隐含的,而资源共享是可选的(考虑RMI,其中结果是在远程机器中计算的).正确地指出,这通常是在考虑到响应性的情况下完成的; 不等待长延迟事件.

并行编程通常将吞吐量作为主要目标,而延迟(即单个元素的完成时间)可能比等效的顺序程序更差.

为了更好地理解并发性和并行性之间的区别,我将引用Daniele Varacca 并发性概率模型,这是并发理论的一组很好的注释:

计算模型是一种并发模型,它能够将系统表示为由独立的自治组件组成,可能相互通信.不应将并发概念与并行概念混淆.并行计算通常涉及一个中央控制,它在几个处理器之间分配工作.在并发性中,我们强调组件的独立性以及它们彼此通信的事实.平行主义就像古埃及,法老决定和奴隶在那里工作.并发就像现代意大利,每个人都做他们想做的事,所有人都使用手机.

总之,并行编程在某种程度上是并发的特殊情况,其中单独的实体协作以获得高性能和吞吐量(通常).

异步和回调只是一种允许程序员表达并发性的机制.考虑众所周知的并行编程设计模式,例如master/worker或map/reduce,是由使用这种低级机制(async)的框架实现的,以实现更复杂的集中式交互.


Pau*_*aul 34

本文非常好地解释了它:http: //urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming

它有关于异步编程的内容:

异步调用用于防止应用程序中的"阻塞".[这样的]调用将在已经存在的线程(例如I/O线程)中分离,并在可能的情况下执行其任务.

关于并行编程:

在并行编程中,您仍然可以分解工作或任务,但关键的区别在于您为每个工作块启动新线程

总结如下:

异步调用将使用系统已在使用的线程,并行编程需要开发人员打破所需的工作,旋转和拆卸线程.

  • 这篇文章>这里的所有答案(当然除了这一个!) (3认同)

And*_*per 17

我的基本理解是:

Asynchonous编程解决了在您可以执行任何其他操作之前等待昂贵操作完成的问题.如果您在等待操作完成时可以完成其他任务,那么这是件好事.示例:在您离开时保持UI运行并从Web服务检索更多数据.

并行编程是相关的,但更关心的是将大型任务分解为可以同时计算的较小块.然后可以组合较小块的结果以产生整体结果.示例:光线跟踪,其中各个像素的颜色基本上是独立的.

它可能比这更复杂,但我认为这是基本的区别.


小智 13

我倾向于考虑这些术语的不同之处:

异步:离开并完成这项任务,当你完成后回来告诉我并带来结果.我将在同一时间继续处理其他事情.

平行:我希望你做这个任务.如果它更容易,请让一些人帮忙.这很紧急,所以我会等到你回来看结果.你回来之前我什么也做不了.

当然,异步任务可能会利用并行性,但至少在我看来,区别在于你是在执行操作时是否继续处理其他事情,或者在结果进入之前完全停止所有事情.


ser*_*kan 13

async:自己在其他地方自己做,并在完成(回调)时通知我.当我可以继续做我的事情.

在此输入图像描述

parallel:雇佣尽可能多的人(线程)并将工作分成他们以便更快完成并在完成时告诉我(回调).当我可能继续做我的其他事情.

在此输入图像描述

主要区别在于并行性主要取决于硬件.


Ric*_*ard 11

这是一个执行顺序的问题.

如果A与B异步,那么我无法事先预测A的子部分何时会发生B的子部分.

如果A与B平行,则A中的事物与B中的事物同时发生.但是,仍然可以定义执行的顺序.

也许困难在于异步这个词是模棱两可的.

当我告诉我的管家跑到商店买更多的葡萄酒和奶酪时,我执行了一个异步任务,然后忘记了他并继续我的小说,直到他再次敲开学习门.并行性在这里发生,但管家和我从事的是根本上不同的任务和不同的社会阶层,所以我们不在这里应用这个标签.

当我们每个人都在洗不同的窗户时,我的女佣团队正在并行工作.

我的赛车支持团队是异步并行的,因为每个团队在不同的轮胎上工作,他们不需要彼此沟通或在他们完成工作时管理共享资源.

我的足球(又称足球)团队做并行工作,因为每个玩家独立处理有关该领域的信息并在其上移动,但他们并非完全异步,因为他们必须沟通并回应他人的沟通.

我的游行乐队也是平行的,因为每个玩家都会阅读音乐并控制他们的乐器,但他们是高度同步的:他们在时间中相互游戏和游行.

凸轮式加特林枪可以被认为是平行的,但是一切都是100%同步的,所以就好像一个过程向前发展.


Cod*_*-EZ 9

为什么异步?

随着今天的应用程序越来越多地连接,也可能是长期运行的任务或阻塞操作,例如网络I/O或数据库操作.因此,通过在后台启动它们并返回到用户界面来隐藏这些操作的延迟非常重要.尽快.这里异步进入图片,响应性.

为什么并行编程?

随着今天的数据集越来越大,计算越来越复杂.因此,在这种情况下,通过将工作负载分成块然后同时执行这些块来减少这些CPU绑定操作的执行时间非常重要.我们可以将其称为"并行".显然,它将为我们的应用程序提供高性能.


小智 7

异步 假设您是客户的联系人,您需要做出响应,即您需要在被询问时共享状态、操作的复杂性、所需的资源等。现在您需要完成一项耗时的操作,因此无法接受,因为您需要 24/7 全天候响应客户。因此,您将耗时的操作委托给其他人,以便您能够做出响应。这是异步的。

并行编程 假设您有一项任务要从一个文本文件中读取 100 行,而读取一行需要 1 秒钟。因此,您需要 100 秒来阅读文本文件。现在您担心客户端必须等待 100 秒才能完成操作。因此,您又创建了 9 个克隆,并使每个克隆从文本文件中读取 10 行。现在阅读 100 行所需的时间仅为 10 秒。因此你有更好的表现。

综上所述,异步编码是为了实现响应性,并行编程是为了性能。


Adi*_*ade 5

异步:在后台运行方法或任务,无阻塞。不一定在单独的线程上运行。使用上下文切换/时间调度。

并行任务:每个任务并行运行。不使用上下文切换/时间调度。