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. uwsgi启动报错WARNING: Can't find section "uwsgi" in INI configuration file autotestsite_uwsgi.ini

    提示配置文件头部找不到 [uwsgi] 解决: 在最上方加上[uwsgi],有时候明明有标识,但是还是提示,那就再加一个

  2. WebService 常用的设置

    1.修改WebService接收长度 <binding name="IAuthServiceSoap11Binding" maxBufferSize="214748 ...

  3. API自动化测试 Soap UI工具介绍

    一.   建立测试用例 (一)   基本概念 soapUI 中工程的层次结构 项目名称:位于最上层 (BookStoreTest),项目可以包含多个服务的定义. REST 服务定义:服务其实是对多个 ...

  4. php中的date和strtotime函数妙用

    php中的两个常用的日期相关函数date和strtotime,相信大家一定不陌生.但我们平时使用都只是基本功能,什么时间戳变日期格式,日期格式变时间戳. 其实这两个函数还有更深的用法: 1.date函 ...

  5. pop控制器

    1.寻找指定的控制器MineViewControllerclass UIViewController *mineVC = nil; for (UIViewController * controller ...

  6. JDBC概念和使用

    JDBC学习:    JAVA的数据获取方式:        1 直接声明变量并赋值.                 2 Scanner类控制台输入        3 IO流(将硬盘存储中的数据读取 ...

  7. 主流服务器虚拟化技术简单使用——Hyper-V(一)

    Tips:因为博客园排版的原因,图片显示不清晰,可以放大网页查看清晰图片. 如果系统使用物理机,需要在BIOS里面开启Intel VT-x(或AMD-V),如果是VMware workstation, ...

  8. 高阶篇:4.2)DFMEA设计失效模式和失效后果分析-总章

    本章目的:了解FMEA和DFMEA的概念. 1.什么是FMEA(what) 潜在的失效模式及后果分析(Potential Failure Mode and Effects Analysis,简称FME ...

  9. ZOJ - 3946-Highway Project(最短路变形+优先队列优化)

    Edward, the emperor of the Marjar Empire, wants to build some bidirectional highways so that he can ...

  10. lvm拉伸与快照

    一.拉伸 *用fdisk分区 *构建pv *将pv加入vg *将pv内的pe加入lv *通过resize将文件系统的容量增加 1.分区 [root@server3 ~]# fdisk /dev/vdb ...