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

Multithreading 如何阐明异步编程和并行编程之间的区别?,multithreading,asynchronous,parallel-processing,Multithreading,Asynchronous,Parallel Processing,许多平台将异步和并行作为提高响应能力的手段。我大体上理解两者之间的区别,但常常发现在我自己和别人的头脑中很难表达清楚 我是一名普通程序员,经常使用异步和回调。平行性让人感觉异国情调 但我觉得它们很容易混淆,特别是在语言设计层面。希望能够清楚地描述它们之间的关系(或不相关),以及每种程序的最佳应用类别。本文对此进行了很好的解释: 关于异步编程,它有以下内容: 异步调用用于防止应用程序内的“阻塞”。[这样的]调用将在已经存在的线程(如I/O线程)中分离,并在可能的情况下执行其任务 这与并行编程有关:

许多平台将异步和并行作为提高响应能力的手段。我大体上理解两者之间的区别,但常常发现在我自己和别人的头脑中很难表达清楚

我是一名普通程序员,经常使用异步和回调。平行性让人感觉异国情调


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

本文对此进行了很好的解释:

关于异步编程,它有以下内容:

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

这与并行编程有关:

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

总而言之:

异步调用将使用系统已经使用的线程并行编程要求开发人员分解所需的工作、启动和拆卸线程


我的基本理解是:

异步编程解决了等待昂贵的操作完成后再做其他事情的问题。如果你能在等待手术完成的同时完成其他事情,那是件好事。示例:在从web服务检索更多数据时保持UI运行

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


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

当您异步运行某个东西时,这意味着它是非阻塞的,您可以执行它,而无需等待它完成并继续执行其他事情。并行意味着同时并行运行多个事物。当您可以将任务分成独立的工作时,并行性工作得很好


以渲染三维动画的帧为例。渲染动画需要很长时间,因此,如果要从动画编辑软件中启动渲染,则可以确保它是异步运行的,这样它就不会锁定用户界面,并且可以继续执行其他操作。现在,该动画的每个帧也可以被视为一个单独的任务。如果我们有多个CPU/内核或多台计算机可用,我们可以并行渲染多个帧以加快总体工作负载。

我倾向于从以下方面考虑差异:

异步:离开并完成这项任务,完成后回来告诉我并带来结果。同时,我会处理其他事情

平行:我要你做这个任务。如果这能让事情变得更简单,请找些人来帮忙。不过这件事很紧急,所以我会在这里等着,直到你带着结果回来。在你回来之前我什么也做不了


当然,异步任务可能会利用并行性,但区别在于——至少在我看来——是在执行操作时继续处理其他事情,还是在结果出来之前完全停止一切

这是一个执行顺序的问题

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

如果A与B并行,那么A中的事情与B中的事情同时发生。但是,执行顺序仍然可以定义

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

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

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

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

我的足球(又名足球)团队在每个球员独立处理球场信息并在球场上移动的同时,也做着平行的工作,但他们并不是完全异步的,因为他们必须进行沟通,并对其他人的沟通做出反应

我的行进乐队也是平行的,因为每个演奏者阅读音乐并控制他们的乐器,但他们是高度同步的:他们互相演奏和行进


cammed gatling枪可以被认为是并行的,但是所有的东西都是100%同步的,所以这就好像一个进程在向前推进。

我认为主要的区别在于并发性和并行性之间

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

并行编程通常以吞吐量为主要目标,而延迟,