35

[译] part 20: golang 并发介绍

 5 years ago
source link: https://studygolang.com/articles/19465?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Go 是一种并发语言,而不是并行语言。在讨论如何在 Go 中处理并发之前,我们必须首先了解什么是并发以及它与并行性的不同之处。

什么是并发

并发是指有处理多个事情的能力,用一个例子来解释。

可以比做一个人慢跑。在他早晨慢跑时,发现鞋带已经松了。然后,这个人停止了跑步,绑鞋带,然后又开始跑步。这是并发的典型示例。这个人能够处理跑步和系鞋带,也就是说,这个人能够处理很多事情,强调一段时间内能做多个事情 :)

什么是并行,它与并发有什么不同

并行性是指同时做了很多事情。它可能听起来类似于并发,但它实际上是不同的。

我们还是用慢跑的例子来理解,我们假设这个人正在慢跑并且他还在 iPod 中听音乐。在这种情况下,这个人同时在慢跑和听音乐,也就是说,他正在做很多事情。强调时间是同时,这称为并行性。

并发与并行

我们用了一个现实世界的例子来理解并发和并行有何不同。现在让我们从更技术的角度来看待它们,因为我们是码农 :)。

Web 浏览器具有各种组件。其中两个是网页的呈现和用于从互联网下载文件的下载程序。我们假设我们已经构建了我们的浏览器代码,使得每个组件都可以独立执行(这是使用 Java 等语言中的线程完成的,我们可以使用 Goroutines 实现这一点,稍后将详细介绍)。当此浏览器在单核处理器中运行时,处理器将在浏览器的两个组件之间切换上下文。它可能有段时间正在下载文件,然后它会切换到呈现用户请求的网页的 html ,这被称为并发。

如果同一个浏览器在多核处理器上运行。在这种情况下,文件下载组件和 HTML 呈现组件可以在不同的核心中同时运行。这被称为并行性。

j2E3em7.png!web
IvyyQnN.png!web

并行并不总是会带来更快的执行时间。这是因为并行运行的组件可能必须相互通信。例如,我们的浏览器在当文件下载完成时,应该将其传达给用户,比如使用窗口弹出。此通信发生在负责下载的组件和负责呈现用户界面的组件之间。并发系统中的通信开销相比要低。在组件在多个核心中并行运行的情况下,这种通信开销很高。因此并行程序并不总能获得更快的执行时间!

并发是 Go 编程语言内置的。Go 使用 Goroutineschannel 在处理并发。我们将在即将到来的教程中详细讨论它们。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK