原文来自:https://golangbot.com/concurrency/
Go是一门并发语言而不是并行。在我们讨论如何处理并发之前,我们先来理解下什么是并发,以及并发和并行的区别。
什么是并发?
并发是指在一段时间内可以同时处理多件事情。最好的解释是举个例子来说明。
我们想象一个人正在跑步,在他晨跑过程中,我们假设他的鞋带松了,他需要停下来系好鞋带后跑步。这是一个典型的并发例子。这个人能够一下子处理跑步和系鞋带这两件事,即立即处理多个任务。
什么是并行,和并发有什么区别?
并行是指同一时刻同时处理多个任务。感觉和并发很想,事实上完全不同。
我们还是以跑步为例。假设这个人在跑步的同时还在听音乐。这种情况,跑步和听音乐是同时进行的,同时做多个任务,这个叫做并行。
从技术上看并发和并行
通过现实中的例子,我们已经明白了什么是并发,以及并发与并行的区别。作为一名极客,我们接下来从技术的角度来考察并发和并行。
假如我们正在编写一个 web 浏览器。这个 web 浏览器有各种组件。其中两个分别是 web 页面的渲染区和从网上下载文件的下载器。假设我们已经构建好了浏览器代码,各个组件也都可以相互独立地运行(通过像 Java 里的线程,或者通过即将介绍的Go语言中的Go协程来实现)。当浏览器在单核处理器中运行时,处理器会在浏览器的两个组件间进行上下文切换。它可能在一段时间内下载文件,转而又对用户请求的 web 页面进行渲染。这就是并发。并发的进程从不同的时间点开始,分别交替运行。在这里,就是在不同的时间点开始进行下载和渲染,并相互交替运行的。
如果该浏览器在一个多核处理器上运行,此时下载文件的组件和渲染 HTML 的组件可能会在不同的核上同时运行。这称之为并行。
并行不一定会加快运行速度,因为并行运行的组件之间可能需要相互通信。在我们浏览器的例子里,当文件下载完成后,应当对用户进行提醒,比如弹出一个窗口。于是,在负责下载的组件和负责渲染用户界面的组件之间,就产生了通信。在并发系统上,这种通信开销很小。但在多核的并行系统上,组件间的通信开销就很高了。所以,并行不一定会加快运行速度!
Go 对并发的支持
Go 编程语言原生支持并发。Go 使用协程(Goroutine) 和信道(Channel)来处理并发。在接下来的教程里,我们还会详细介绍它们。
并发的介绍到此结束。请留下你的反馈和评论。祝您愉快。