Go 是一种并发语言,而不是并行语言。在讨论 Go 中如何处理并发之前,我们必须首先了解什么是并发以及它与并行有何不同。
什么是并发?
并发性是指同时处理很多事情的能力。最好用一个例子来解释。
让我们考虑一个人慢跑。假设他早上慢跑时,鞋带松了。现在,这个人停止跑步,系上鞋带,然后再次开始跑步。这是并发的一个典型例子。这个人能够同时处理跑步和系鞋带,也就是说,这个人能够同时处理很多事情
什么是并行性以及它与并发有何不同?
并行性是同时做很多事情。这听起来可能与并发相似,但实际上是不同的。
让我们通过相同的慢跑示例更好地理解它。在本例中,我们假设此人正在慢跑,并且还在听音乐。在这种情况下,这个人一边慢跑一边听音乐,也就是说他同时在做很多事情。这称为并行性。
并发和并行——技术角度
我们通过现实世界的例子了解了什么是并发以及它与并行的不同。现在让我们从更技术的角度来看看它们
假设我们正在编写一个网络浏览器。Web 浏览器具有各种组件。其中两个是网页渲染区域和用于从互联网下载文件的下载器。假设我们已经以这样的方式构建了浏览器的代码,即每个组件都可以独立执行(这是使用 Java 等语言中的线程来完成的,在 Go 中我们可以使用 Goroutines 来实现这一点,稍后会详细介绍)。当此浏览器在单核处理器中运行时,处理器将在浏览器的两个组件之间进行上下文切换。它可能会下载一个文件一段时间,然后可能会切换到呈现用户请求的网页的 html。这称为并发。并发进程在不同的时间点启动,并且它们的执行周期重叠。在这种情况下,下载和渲染在不同的时间点开始并且它们的执行重叠。
假设同一个浏览器在多核处理器上运行。在这种情况下,文件下载组件和HTML渲染组件可能同时运行在不同的内核中。这称为并行性。
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20231019111304435.png&pos_id=img-4pDfjGAx-1698112787097
并行性并不总是会导致更快的执行时间。这是因为并行运行的组件可能必须相互通信。例如,就我们的浏览器而言,当文件下载完成时,应该将其传达给用户,例如使用弹出窗口。这种通信发生在负责下载的组件和负责呈现用户界面的组件之间。这种通信开销在并发系统中很低。当组件在多个内核中并行运行时,这种通信开销会很高。因此,并行程序并不总是会导致更快的执行时间!
Go 中对并发的支持
并发性是 Go 编程语言的固有部分。Go 中使用Goroutines和通道来处理并发性。我们将在接下来的教程中详细讨论它们。
这就是并发的介绍。请留下您的反馈和意见。祝你有美好的一天。