并发性简介
Q7nl1s admin

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

什么是并发性?

并发是指同时处理很多事情的能力。用一个例子来解释它是最好的。

让我们考虑一个人在慢跑。在他的晨跑中,假设他的鞋带被解开了。现在这个人停止跑步,系好鞋带,然后又开始跑步。这是一个典型的并发性例子。这个人能够同时处理跑步和系鞋带,也就是说这个人能够同时处理很多事情 :)

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

并行性是指在同一时间做很多事情。它听起来可能与并发性相似,但实际上是不同的。

让我们用同一个慢跑的例子来更好地理解它。在这种情况下,让我们假设这个人在慢跑的同时也在听iPod上的音乐。在这种情况下,这个人同时在慢跑和听音乐,也就是说他同时在做很多事情。这就是所谓的并行性。

并发和并行 - 技术观点

我们通过现实世界的例子了解了什么是并发性,以及它与并行性有什么不同。现在让我们从更多的技术角度来看待它们,因为我们是极客:)。

比方说,我们正在为一个网络浏览器编程。网络浏览器有各种组件。其中两个是网页渲染区和用于从互联网上下载文件的下载器。让我们假设我们已经将浏览器的代码结构化,使每个组件都能独立执行(这在Java等语言中是通过线程实现的,在Go中我们可以通过Goroutines实现,后面会有更多的介绍)。当这个浏览器在单核处理器中运行时,处理器会在浏览器的两个组件之间进行上下文切换。它可能正在下载一个文件一段时间,然后可能切换到渲染用户请求的网页的html。这就是所谓的并发性。并发进程在不同的时间点开始,它们的执行周期是重叠的。在这种情况下,下载和渲染是在不同的时间点开始的,它们的执行是重叠的。

假设同一个浏览器在一个多核处理器上运行。在这种情况下,文件下载组件和HTML渲染组件可能在不同的内核中同时运行。这就是所谓的并行性。

concurrency-parallelism

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

Go中对并发性的支持

并发是Go编程语言的一个固有部分。Go中使用Goroutines和通道来处理并发性。我们将在接下来的教程中详细讨论它们。

关于并发性的介绍就到此为止,祝你有个愉快的一天。

 Comments
Comment plugin failed to load
Loading comment plugin
Powered by Hexo & Theme Keep
Unique Visitor Page View