[译] part 20: golang 并发介绍

https://juejin.im/post/5ca2376bf265da30851f9e23

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

什么是并发

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

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

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

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

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

并发与并行

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

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

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











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

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

ft_authoradmin  ft_create_time2019-08-03 16:37
 ft_update_time2019-08-03 16:37