- 原文地址:Part 22: Introduction to Concurrency
- 原文作者:Naveen R
- 译者:咔叽咔叽
转载请注明出处。
Go 是一种并发语言,而不是并行语言。在讨论如何在 Go 中处理并发之前,我们必须首先了解什么是并发以及它与并行性的不同之处。
什么是并发
并发是指有处理多个事情的能力,用一个例子来解释。
可以比做一个人慢跑。在他早晨慢跑时,发现鞋带已经松了。然后,这个人停止了跑步,绑鞋带,然后又开始跑步。这是并发的典型示例。这个人能够处理跑步和系鞋带,也就是说,这个人能够处理很多事情,强调一段时间内能做多个事情 :)
什么是并行,它与并发有什么不同
并行性是指同时做了很多事情。它可能听起来类似于并发,但它实际上是不同的。
我们还是用慢跑的例子来理解,我们假设这个人正在慢跑并且他还在 iPod 中听音乐。在这种情况下,这个人同时在慢跑和听音乐,也就是说,他正在做很多事情。强调时间是同时,这称为并行性。
并发与并行
我们用了一个现实世界的例子来理解并发和并行有何不同。现在让我们从更技术的角度来看待它们,因为我们是码农 :)。
Web 浏览器具有各种组件。其中两个是网页的呈现和用于从互联网下载文件的下载程序。我们假设我们已经构建了我们的浏览器代码,使得每个组件都可以独立执行(这是使用 Java 等语言中的线程完成的,我们可以使用 Goroutines 实现这一点,稍后将详细介绍)。当此浏览器在单核处理器中运行时,处理器将在浏览器的两个组件之间切换上下文。它可能有段时间正在下载文件,然后它会切换到呈现用户请求的网页的html
,这被称为并发。
如果同一个浏览器在多核处理器上运行。在这种情况下,文件下载组件和 HTML 呈现组件可以在不同的核心中同时运行。这被称为并行性。
并行并不总是会带来更快的执行时间。这是因为并行运行的组件可能必须相互通信。例如,我们的浏览器在当文件下载完成时,应该将其传达给用户,比如使用窗口弹出。此通信发生在负责下载的组件和负责呈现用户界面的组件之间。并发系统中的通信开销相比要低。在组件在多个核心中并行运行的情况下,这种通信开销很高。因此并行程序并不总能获得更快的执行时间!
并发是 Go 编程语言内置的。Go 使用Goroutines
和channel
在处理并发。我们将在即将到来的教程中详细讨论它们。
有疑问加站长微信联系(非本文作者)