首页 文章

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

提问于
浏览
104

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

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

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

12 回答

  • 3

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

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

  • 50

    我倾向于想到这些术语的不同之处:

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

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

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

  • 8

    async :通过 yourself 在其他地方执行此操作,并在完成(回调)时通知我 . 当我可以继续做我的事情 .

    enter image description here

    parallelHire as many guys(threads) as you wish 并将作业拆分给他们以完成 quicker 并在完成后告诉我(回调) . 当我 might 继续做我的其他东西 .

    enter image description here

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

  • 12

    我认为主要区别在于 concurrencyparallelism 之间 .

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

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

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

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

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

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

  • 27

    我来到这里对这两个概念相当满意,但对我来说并不清楚 .

    在阅读了一些答案后,我认为我有一个正确而有用的比喻来描述差异 .

    如果你认为你的个人代码行是单独但有序的扑克牌(如果我解释老式打卡如何工作,请阻止我),然后为每个单独的程序写你将拥有一堆独特的卡片(不要复制和粘贴!),正常运行代码和异步运行代码之间的差异取决于你是否关心 .

    当您运行代码时,您将操作系统交给一组单个操作(您的编译器或解释器将您的“更高”级代码打破)以传递给处理器 . 使用一个处理器,任何时候都只能执行一行代码 . 因此,为了实现同时运行多个进程的错觉,操作系统使用一种技术,它一次只从给定进程向处理器发送几行,根据它看到的方式在所有进程之间切换适合 . 结果是多个进程向同一时间的最终用户显示进度 .

    对于我们的比喻,关系是操作系统在将卡发送到处理器之前总是将卡洗牌 . 如果您的堆栈卡不依赖于另一个堆栈,则在另一个堆栈变为活动状态时,您不会注意到堆栈已停止从中选择 . 所以,如果你不在乎它没关系 .

    但是,如果你关心(例如,有多个进程 - 或堆栈的卡 - 彼此依赖),那么操作系统的改组会搞砸你的结果 .

    编写异步代码需要处理执行顺序之间的依赖关系,而不管最终的顺序是什么 . 这就是使用像“回调”这样的结构的原因 . 他们对处理器说,“接下来要做的就是告诉另一个堆栈我们做了什么” . 通过使用这些工具,您可以确保在允许操作系统再运行其指令之前通知另一个堆栈 . (“如果called_back == false:send(no_operation)” - 不确定这实际上是如何实现的,但从逻辑上来说我认为它是一致的)

    对于并行进程,不同之处在于您有两个彼此不关心的堆栈以及两个处理它们的工作者 . 在一天结束时,您可能需要将两个堆栈的结果组合在一起,这将是同步问题,但是,执行时,您不必再关心 .

    不确定这是否有帮助,但我总能找到多种解释 . 另请注意,异步执行不限于单个计算机及其处理器 . 一般来说,它涉及时间,或(甚至更一般地说)事件的顺序 . 因此,如果您将依赖堆栈A发送到网络节点X并将其耦合堆栈B发送到Y,则正确的异步代码应该能够解决这种情况,就像它在笔记本电脑上本地运行一样 .

  • 15

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

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

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

    关于并行编程:

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

    总结如下:

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

  • 3

    这是执行顺序的问题 .

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

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

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

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

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

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

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

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

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

  • 11

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

    并行任务:每个任务都以平行方式运行 . 不使用上下文切换/时间调度 .

  • 9

    Asynchronous 假设您是客户的联系人,您需要做出回应,即您需要分享状态,操作的复杂性,所需资源等 . 现在您需要完成一项耗时的操作,因此无法对此进行操作,因为您需要全天候响应客户端 . 因此,您将耗时的操作委派给其他人,以便您能够做出响应 . 这是异步的 .

    Parallel programming 让's you have a task to read say 100 lines from a text file and reading one line takes 1 sec. Hence, you' ll需要100秒才能读取文本文件 . 现在您担心客户端必须等待100秒才能完成操作 . 因此,您再创建9个克隆,并从文本文件中分别读取10行 . 现在所需的时间仅为10秒,可以读取100行 . 因此,你有更好的表现 .

    总而言之,完成异步编码以实现响应性并且为性能完成并行编程 .

  • 71

    我的基本理解是:

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

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

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

  • 0

    Why Asynchronous ?

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

    Why parallel programming?

    在今天,减少这些CPU绑定操作的执行时间非常重要,在这种情况下,通过将工作负载分成块然后同时执行这些块 . 我们可以将其称为"Parallel" . 显然它会给我们的应用程序提供高 Performance .

  • 1

    一般来说,只有两种方法可以一次完成一件事 . 一个是 asynchronous ,另一个是 parallel .

    从高级别,如流行的服务器 nginxPython 着名库 Tornado ,他们都充分利用异步范例,即单线程服务器可以同时服务数千个客户端(一些 IOloopcallback ) . 使用 ECF (异常控制跟随)可以实现异步编程范例 . 所以异步有时并不真正同时做事,但是一些io绑定工作,异步可以真正提升性能 .

    parallel 范例总是指多线程和多处理 . 哪个可以充分利用多核处理器,真正同时做事 .

相关问题