CONCURRENCY VS PARALLELISM:在一个时间点并发只能完成一项任务 . 例如:单点cpu处理器并行性在一点上我们可以做多个任务 . 例如:双核或多核处理器
0
Parallel : It 's a broad term that means that two pieces of code execute that 1838290 to the point where the parallel execution becomes 1838291 . Sounds vague and simplistic? Yes. I' m试图帮助您专注于这些概念之间的差异,而不是提供每个单独的技术定义 .
9 回答
并发和并行实际上与您正确猜测的原理相同,两者都与同时执行的任务有关,尽管我会说并行任务应该是真正的多任务处理,“同时”执行,而并发可能意味着任务共享执行线程,但仍然表现为并行执行 .
异步方法与前两个概念没有直接关系,异步用于表示并发或并行任务的印象,但实际上异步方法调用通常用于需要远离当前应用程序工作的进程,我们不要我想等待并阻止我们的应用程序等待响应 .
例如,从数据库获取数据可能需要一些时间,但我们不希望阻止我们的UI等待数据 . asynch调用接受回调引用,并在请求与远程系统一起发送后立即将执行返回给您的代码 . 当远程系统执行所需的任何处理时,您的UI可以继续响应用户,一旦将数据返回到您的回调方法,该方法就可以根据需要更新UI(或切换该更新) .
从用户角度来看,它看起来像多任务,但可能不是 .
编辑
可能值得补充的是,在许多实现中,异步方法调用将导致线程被旋转,但它并不重要,它实际上取决于正在执行的操作以及如何将响应通知回系统 .
简而言之,
并发意味着在重叠的时间段内以无特定顺序启动,运行和完成的多个任务 . 并行性是指多个任务或一个独特任务的几个部分同时运行,例如,在多核处理器上 .
Differences between concurrency vs. parallelism
现在让我们列出并发和并行之间的显着差异 .
并发是指两个任务可以在重叠的时间段内启动,运行和完成 . 并行性是指任务在同一时间运行,例如 . 在多核处理器上 .
并发性是独立执行进程的组合,而并行性是(可能相关的)计算的同时执行 .
并发性是指同时处理大量事物 . 并行性是指同时做很多事情 .
应用程序可以是并发的 - 但不是并行的,这意味着它同时处理多个任务,但没有两个任务在同一时刻执行 .
应用程序可以是并行的 - 但不是并发的,这意味着它可以同时处理多核CPU中任务的多个子任务 .
应用程序既不能并行也不能并发,这意味着它可以按顺序一次处理所有任务 .
应用程序既可以并行也可以并发,这意味着它可以同时在多核CPU中同时处理多个任务 .
Concurrency
Parallelism
Asynchronous methods
Concurrency 是多个任务的执行是交错的,而不是每个任务一个接一个地顺序执行 .
Parallelism 是某些任务实际并行执行的时间 .
Asynchrony 是一个单独的概念(即使在某些情况下相关) . 它指的是一个事件可能在另一个事件的不同时间(不同步)发生 . 下图说明了同步和异步执行之间的区别,其中actor可以对应于不同的线程,进程甚至服务器 .
每个人都无法将异步与并行或并发相关联,因为异步不是并行或并发的反义词 . 它是Synchronous的反义词 . 这只是表明某些东西(在本例中是线程)是否与其他内容同步,在这种情况下是另一个线程 .
从http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html
CONCURRENCY VS PARALLELISM:在一个时间点并发只能完成一项任务 . 例如:单点cpu处理器并行性在一点上我们可以做多个任务 . 例如:双核或多核处理器
Parallel : It 's a broad term that means that two pieces of code execute that 1838290 to the point where the parallel execution becomes 1838291 . Sounds vague and simplistic? Yes. I' m试图帮助您专注于这些概念之间的差异,而不是提供每个单独的技术定义 .
所以我写了"real"因为可以在一定程度上模拟并行性 . 许多系统,例如游戏,实现了在每个执行循环期间执行大量任务的子系统(例如:其中一些广泛使用代理),但大多数时候它们只是在它们各自执行的意义上是并行的他们的小东西没有可预测的顺序,看似随机访问数据,即使你实现了某种原始的基于软件的合作多任务来组织整个事情,它仍然没有真正平行 . 这只是一个非常复杂的顺序系统 .
您可能会说当并存在第三方系统(无论是基础抢占式操作系统提供线程还是CPU核心)时,并行性变为现实,这些系统专门用于在无法控制的黑盒子中运行代码(除了它们的时间除外)开始,它们产生的结果,以及你可能抛出的任何互斥锁或信号量)
Concurrent : 没有并行性就没有并发性(无论是模拟的还是真实的,如上所述),但这个术语特别关注两个系统在某个时刻同时尝试访问同一资源的事实 . 它强调的事实是你将不得不处理这个问题 .
Asynchronous :每个人都说对,异步与并行性无关,但它为它铺平了道路(负担是让你把事情做成平行与否 - 继续阅读) .
您可能会将此概念视为通过形式化并行性中通常涉及的三个基本事物来表示并行性的一种方式:1)定义任务的初始化(例如,它何时开始以及它获得什么参数),2)在完成后必须完成的事情和3)代码应该继续做什么 .
但它仍然只是语法(通常它表示为回调方法) . 在场景的后面,底层系统可能只是简单地决定这些所谓的“任务”只是代码的片段,直到完成它当前正在执行的代码为止 . 然后它逐个解压缩它们并按顺序执行它们 . 或不 . 它还可以为每个任务创建一个线程并并行运行它们 . 谁在乎?该部分未包含在概念中;)
在这里我用一些例子来解释
并发
web service 实时接收许多小请求,它需要以不同方式处理这些请求,并且独立于其他请求 .
执行了许多任务
实时
具有不同的执行顺序(每个调用可以有多个任务或一个任务可以不同的方式运行)
本质上缩短了响应时间
平行
GPU 使用并行处理在数千个物理和逻辑线程上处理相同的代码块(AKA内核) . 每个内核调用有时会使用不同的内存块进行读/写操作 . 理想情况下,进程同时开始和结束所有线程 . 没有超线程的单CPU内核无法进行并行处理 .
在多个处理器上执行一个内核
同时
具有单个执行序列(有一个内核,其中分支或如果避免)
本质上提高了速度
异步
如果它在GUI线程上运行, One heavy process (就像I / O操作一样)可以轻松阻止GUI . 为了保证UI响应能力,可以异步执行繁重的进程 . 最好一次运行一个类似的异步操作 . 例如如果同时运行,多个IO绑定操作可能会明显变慢,因此最好将它们排队以完成启动
在另一个线程上执行一个任务或一批任务
一次或一次一次
执行顺序无关紧要/适用,因为没有并发性
本质上降低了速度,但提供了对另一个线程的响应
Note: 同时执行的异步操作(即,一次多于一次)是并发操作 .
有几种情况可以发生并发:
Asynchrony - 这表示您的程序执行非阻塞操作 . 例如,它可以通过HTTP发起对远程资源的请求,然后在等待接收响应时继续执行其他任务 . 这有点像你发送电子邮件然后继续你的生活而不等待回应 .
Parallelism - 这意味着您的程序利用多核机器的硬件同时执行任务,将工作分解为任务,每个任务都在一个单独的核心上执行 . 这有点像在洗澡时唱歌:你实际上是在同一时间做两件事 .
Multithreading - 这是一个软件实现,允许同时执行不同的线程 . 多线程程序似乎在同一时间执行多项操作,即使它在单核机器上运行也是如此 . 这有点像与不同的人聊天通过各种IM窗口;虽然你实际上来回切换,但最终的结果是你同时进行了多次对话 .