[译] part 20: golang 并发介绍

咔叽咔叽_7647 · · 945 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

什么是并发

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

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

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

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

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

并发与并行

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

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

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



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

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:咔叽咔叽_7647

查看原文:[译] part 20: golang 并发介绍

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

945 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传