许多平台都将异步和并行作为提高响应性的手段。我大体上理解其中的不同之处,但经常发现很难在自己的脑海中表达出来,也很难表达给其他人。
我是一名日常程序员,经常使用异步和回调。并行给人一种异国情调。
但我觉得它们很容易混淆,特别是在语言设计层面。我希望清楚地描述它们是如何相关(或不相关)的,以及每个程序的类别都是最好的应用。
发布于 2011-05-26 12:39:44
当你异步运行某些东西时,这意味着它是非阻塞的,你不需要等待它完成就可以执行它,并继续执行其他事情。并行意味着同时并行运行多个东西。当您可以将任务分离为独立的工作片段时,并行性工作得很好。
以渲染3D动画的帧为例。渲染动画需要很长的时间,所以如果你要从动画编辑软件中启动渲染,你应该确保它是异步运行的,这样它就不会锁定你的UI,而你可以继续做其他事情。现在,该动画的每一帧也可以被视为单独的任务。如果我们有多个CPU/核心或多台机器可用,我们可以并行渲染多个帧,以加快整体工作负载。
发布于 2013-07-21 05:36:12
我认为主要区别在于concurrency和parallelism之间。
Async和Callback通常是表示并发性的一种方式(工具或机制),即一组可能相互对话并共享资源的实体。在异步或回调的情况下,通信是隐式的,而资源共享是可选的(考虑在远程机器上计算结果的RMI )。正如正确指出的,这通常是在考虑响应的情况下完成的;不等待长时间的延迟事件。
并行程序通常以吞吐量为主要目标,而延迟,即单个元素的完成时间,可能比等效的顺序程序更差。
为了更好地理解并发和并行之间的区别,我将引用Daniele Varacca的并发概率模型,这是一组很好的并发理论注释:
计算模型是一种并发模型,当它能够将系统表示为由独立的自治组件组成时,可能会相互通信。并发性的概念不应该与并行性的概念混淆。并行计算通常涉及一个中央控制,它将工作分配到几个处理器上。在并发中,我们强调组件的独立性,以及它们相互通信的事实。并行性就像古埃及,法老在那里决定,而奴隶在那里工作。并发就像现代的意大利,每个人都做自己想做的事情,并且都使用手机。
总结,并行编程在某种程度上是并发的特例,在这种情况下,独立的实体协作以获得高性能和吞吐量(通常)。
异步和回调只是一种允许程序员表达并发性的机制。考虑到众所周知的并行编程设计模式,例如主/从属或映射/还原,是由使用这种低级机制(异步)来实现更复杂的集中式交互的框架实现的。
发布于 2011-05-26 12:14:29
本文很好地解释了这一点:http://urda.cc/blog/2010/10/04/asynchronous-versus-parallel-programming
关于异步编程,它是这样的:
异步调用用于防止应用程序中的“阻塞”。这样的调用将在已存在的线程(如I/O线程)中分离,并在可能的情况下执行其任务。
这是关于并行编程的:
在并行编程中,您仍然可以拆分工作或任务,但关键区别在于,您可以为每个工作块旋转新的线程
总结一下:
异步调用将使用系统已经在使用的线程和并行编程要求开发人员分解所需的启动、启动和拆卸线程。
https://stackoverflow.com/questions/6133574
复制相似问题