Go 是一种并发语言,而不是并行语言。在讨论 Go 中如何处理并发之前,我们必须首先了解什么是并发以及它与并行有何不同。
什么是并发?
并发性是指同时处理很多事情的能力。最好用一个例子来解释。
让我们考虑一个人慢跑。假设他早上慢跑时,鞋带松了。现在,这个人停止跑步,系上鞋带,然后再次开始跑步。这是并发的一个典型例子。这个人能够同时处理跑步和系鞋带,也就是说,这个人能够同时处理很多事情
什么是并行性以及它与并发有何不同?
并行性是同时做很多事情。这听起来可能与并发相似,但实际上是不同的。
让我们通过相同的慢跑示例更好地理解它。在本例中,我们假设此人正在慢跑,并且还在听音乐。在这种情况下,这个人一边慢跑一边听音乐,也就是说他同时在做很多事情。这称为并行性。
 
并发和并行——技术角度
我们通过现实世界的例子了解了什么是并发以及它与并行的不同。现在让我们从更技术的角度来看看它们
假设我们正在编写一个网络浏览器。Web 浏览器具有各种组件。其中两个是网页渲染区域和用于从互联网下载文件的下载器。假设我们已经以这样的方式构建了浏览器的代码,即每个组件都可以独立执行(这是使用 Java 等语言中的线程来完成的,在 Go 中我们可以使用 Goroutines 来实现这一点,稍后会详细介绍)。当此浏览器在单核处理器中运行时,处理器将在浏览器的两个组件之间进行上下文切换。它可能会下载一个文件一段时间,然后可能会切换到呈现用户请求的网页的 html。这称为并发。并发进程在不同的时间点启动,并且它们的执行周期重叠。在这种情况下,下载和渲染在不同的时间点开始并且它们的执行重叠。
假设同一个浏览器在多核处理器上运行。在这种情况下,文件下载组件和HTML渲染组件可能同时运行在不同的内核中。这称为并行性。



















