multithreading - async overview




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

许多平台都提高了异步性和并行性,作为提高响应速度的手段。 我通常理解差异,但经常发现很难在我自己的脑海中以及在其他人身上表达。

我是一个workaday程序员,经常使用异步和回调。 平行主义感觉异乎寻常。

但我觉得他们很容易混淆,特别是在语言设计层面。 会喜欢清楚描述它们如何相关(或不相关),以及哪些程序类别最适用。


为什么是异步?

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

为什么要并行编程

随着今天的数据集越来越大,计算越来越复杂。 因此,减少这些CPU绑定操作的执行时间非常重要,在这种情况下,将工作负载分成块并同时执行这些块。 我们可以称之为“并行”。 显然它会给我们的应用带来很高的性能


异步 :在别处执行此操作,并在完成(回调)时通知我。 当时我可以继续做我的事情。

并行 :根据需要雇佣许多人(线程),并将工作分配给他们以更快完成,并在完成时让我知道(回调)。 到时候我可能会继续做我的其他东西。

并行性的主要区别主要取决于硬件。


当你异步运行某个东西时,意味着它是非阻塞的,你可以在不等待它完成并继续其他事情的情况下执行它。 并行性意味着并行地同时运行多个事物。 如果可以将任务分解为独立的工作,则并行性效果很好。

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


我倾向于考虑这些术语的差异:

异步:离开并完成这项任务,当你完成回来并告诉我并带来结果时。 与此同时,我将继续努力。

平行:我希望你做这个任务。 如果它更容易,请让一些人帮忙。 尽管这很紧急,所以我会在这里等到你回来的结果。 直到你回来,我什么也做不了。

当然,一个异步任务可能会利用并行性,但至少在我看来,这种区别在于在操作执行时是否继续其他事情,或者直到结果是否完全停止。


我的基本理解是:

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

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

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


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

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

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

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

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

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

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


这篇文章解释得非常好: http://urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming : http://urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming

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

异步调用用于防止应用程序中的“阻塞”。 [这样的]调用将在已经存在的线程(如I / O线程)中分离出来,并在可能时执行其任务。

这关于并行编程:

在并行编程中,您仍然会分解工作或任务,但主要区别在于您为每个工作块启动新线程

总结如下:

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





parallel-processing