Go是并发语言,而不是并行语言。在讨论Go并发性之前,我们必须首先了解什么是并发,以及并发与并行的区别。

什么是并发

并发(concurrency)是指一次处理大量事情的能力。让我们用一个例子来说明。

假设一个人喜欢慢跑。在早上的慢跑中,他的鞋带开了。现在他停下来系鞋带,然后继续慢跑。这就是典型的并发。这个人有能力处理慢跑和系鞋带两件事情,也就是说这个人一次处理了多个事情。

什么是并行?并行与并发的区别在哪?

并行(parallelism)指的是同时处理多个事情。虽然听起来像并发,但是它们是不同的。

同样是慢跑的例子。这次让我们假设这个慢跑爱好者一边慢跑一遍用他的 iPod 听音乐。这个例子里这位慢跑爱好者同时进行慢跑和听音乐,也就是说这个人同时做了多件事情。这就是并行。

从技术观点看并发和并行

我们已经通过现实中的例子明白了什么是并行,以及并行与并发的区别。现在让我们从更技术一点的角度来看待他们(谁让我们是怪胎呢?)。

假设我们在实现一个 Web 浏览器。 Web 浏览器有许多模块。其中的两个是对页面进行渲染的渲染器和从互联网下载文件的下载器。让我们假设我们已经很好的组织了我们的代码结构,使得这两个组件可以独立的运行(这可能是使用了 Java 中的线程,也可能使用了 Go 中的协程,我们将稍后介绍 Go 协程)。当我们的浏览器运行在单核 CPU 上时,CPU 将在浏览器的这两个组件之间进行上下文切换。它可能(使用下载模块)进行下载文件一段时间后,切换到渲染模块去渲染用户请求的HTML页面。我们已经知道这是并发。并发处理是从不同的时间点开始,而它们的执行周期是重叠的。在本例中,下载和渲染在不同的时间点开始,它们的执行是重叠的。

假设同样的浏览器运行在多核 CPU 上。在这里文件下载模块和页面渲染模块可以同时运行在 CPU 的不同核上。这就是我们所说的并行。

并行并不总是能够提升运行速度。这是因为并行的两个模块在运行的时候可能需要同步。例如,还是这个浏览器的例子,当文件下载完成时,应该使用弹出窗口来通知用户。而这种通信发生在负责下载的组件和负责渲染用户界面的组件之间。在并发系统中,这种通信的开销很低。而如果这两个组件并行地运行在 CPU 的不同核上,这种通信的开销却很大。因此并行程序并不一定会执行得更快。

Go对并发的支持

Go 原生支持并发。在Go中,使用 Go 协程(Goroutine)和信道(channel)来处理并发。

本文转自:https://blog.csdn.net/u011304970/article/details/75095241

Golang教程:并发介绍的更多相关文章

  1. Golang教程:goroutine协程

    在上一篇中,我们讨论了并发,以及并发和并行的区别.在这篇教程中我们将讨论在Go中如何通过Go协程实现并发. 什么是协程 Go协程(Goroutine)是与其他函数或方法同时运行的函数或方法.可以认为G ...

  2. golang的并发

    Golang的并发涉及二个概念: goroutine channel goroutine由关键字go创建. channel由关键字chan定义 channel的理解稍难点, 最简单地, 你把它当成Un ...

  3. golang的并发不等于并行

    先 看下面一道面试题: func main() { runtime.GOMAXPROCS(1) wg := sync.WaitGroup{} wg.Add(20) for i := 0; i < ...

  4. Apache Solr 初级教程(介绍、安装部署、Java接口、中文分词)

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  5. Python爬虫教程-08-post介绍(百度翻译)(下)

    Python爬虫教程-08-post介绍(下) 为了更多的设置请求信息,单纯的通过urlopen已经不太能满足需求,此时需要使用request.Request类 构造Request 实例 req = ...

  6. Python爬虫教程-07-post介绍(百度翻译)(上)

    Python爬虫教程-07-post介绍(百度翻译)(上) 访问网络两种方法 get: 利用参数给服务器传递信息 参数为dict,使用parse编码 post :(今天给大家介绍的post) 一般向服 ...

  7. Golang教程:包

    什么是包?为什么使用包? 到目前为止我们见到的 Go 程序都只有一个文件,文件中包含了一个main函数和几个其他函数.在实际中这种将所有代码都放在一个文件里的组织方式是不可行的.这样的组织方式使得代码 ...

  8. Golang教程:类型

    下面是 Go 支持的基本类型: bool Numeric Types  int8, int16, int32, int64, int uint8,uint16,uin32,uint64, uint f ...

  9. Arduino可穿戴开发入门教程LilyPad介绍

    Arduino可穿戴开发入门教程LilyPad介绍 Arduino输出模块 LilyPad官方共提供了4种输出模块,他们分别是单色LED模块(图1.5).三色LED模块(图1.6).蜂鸣器模块(图1. ...

  10. go---weichart个人对Golang中并发理解

    个人觉得goroutine是Go并行设计的核心,goroutine是协程,但比线程占用更少.golang对并发的处理采用了协程的技术.golang的goroutine就是协程的实现. 十几个gorou ...

随机推荐

  1. SQL Server 2008R2 附件数据库问题记录

    在Sql Server 2008 R2里附加数据库时弹出xxx.mdf拒绝访问的错误 详细错误信息如下: TITLE: Microsoft SQL Server Management Studio-- ...

  2. 启动redis一闪就关

    解决方法:1-win+R 打开命令行2-cd至redis目录,例如 D:\redis>3-输入 redis-server.exe redis.windows.conf观察是否如图1:至此,已成功 ...

  3. MVC dropdownlist 下拉框

    List<SelectListItem> items = new List<SelectListItem>(); items.Add(new SelectListItem() ...

  4. 聊聊 JDK 阻塞队列源码(ReentrantLock实现)

    项目中用到了一个叫做 Disruptor 的队列,今天楼主并不是要介绍 Disruptor 而是想巩固一下基础扒一下 JDK 中的阻塞队列,听到队列相信大家对其并不陌生,在我们现实生活中队列随处可见, ...

  5. Spring整合JPA时,为实体类添加@Entity注解时提示The type MultipartEntity is deprecated

    这个情况是由于导入错了Entity包所导致的. 按住Alt+T时,会有两个关于@Entity的提示 org.hibernate.annotations.Entity 和 javax.persisten ...

  6. 当页面滚动到距顶部一定高度时某DIV自动隐藏和显示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 搜索下拉 select美化

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. CentOS下 Yum 损坏与重建

    yum报错error: rpmdb open failed 这种情况一般是由于rpm数据库被损坏导致的,可按照下述方法重建yum数据库: cd /var/lib/rpm/ rm -rf __db.* ...

  9. Ionic无法通过npm安装解决方案

    http://www.jianshu.com/p/5a99334eb62d 一般从 node.js官网下载安装完之后,npm也会同时安装完. 如果通过 $ npm install -g cordova ...

  10. webpack2的一些使用入门

    首先创建一个webpack文件夹我取名叫webpackVue(为了后续把vue集成进来) 1.首先用npm初始化一下,在这个目录下,执行npm init 2.npm install webpack - ...