Golang教程:并发介绍
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教程:并发介绍的更多相关文章
- Golang教程:goroutine协程
在上一篇中,我们讨论了并发,以及并发和并行的区别.在这篇教程中我们将讨论在Go中如何通过Go协程实现并发. 什么是协程 Go协程(Goroutine)是与其他函数或方法同时运行的函数或方法.可以认为G ...
- golang的并发
Golang的并发涉及二个概念: goroutine channel goroutine由关键字go创建. channel由关键字chan定义 channel的理解稍难点, 最简单地, 你把它当成Un ...
- golang的并发不等于并行
先 看下面一道面试题: func main() { runtime.GOMAXPROCS(1) wg := sync.WaitGroup{} wg.Add(20) for i := 0; i < ...
- Apache Solr 初级教程(介绍、安装部署、Java接口、中文分词)
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...
- Python爬虫教程-08-post介绍(百度翻译)(下)
Python爬虫教程-08-post介绍(下) 为了更多的设置请求信息,单纯的通过urlopen已经不太能满足需求,此时需要使用request.Request类 构造Request 实例 req = ...
- Python爬虫教程-07-post介绍(百度翻译)(上)
Python爬虫教程-07-post介绍(百度翻译)(上) 访问网络两种方法 get: 利用参数给服务器传递信息 参数为dict,使用parse编码 post :(今天给大家介绍的post) 一般向服 ...
- Golang教程:包
什么是包?为什么使用包? 到目前为止我们见到的 Go 程序都只有一个文件,文件中包含了一个main函数和几个其他函数.在实际中这种将所有代码都放在一个文件里的组织方式是不可行的.这样的组织方式使得代码 ...
- Golang教程:类型
下面是 Go 支持的基本类型: bool Numeric Types int8, int16, int32, int64, int uint8,uint16,uin32,uint64, uint f ...
- Arduino可穿戴开发入门教程LilyPad介绍
Arduino可穿戴开发入门教程LilyPad介绍 Arduino输出模块 LilyPad官方共提供了4种输出模块,他们分别是单色LED模块(图1.5).三色LED模块(图1.6).蜂鸣器模块(图1. ...
- go---weichart个人对Golang中并发理解
个人觉得goroutine是Go并行设计的核心,goroutine是协程,但比线程占用更少.golang对并发的处理采用了协程的技术.golang的goroutine就是协程的实现. 十几个gorou ...
随机推荐
- How can i use iptables on centos 7 or fedora?
http://stackoverflow.com/questions/24756240/how-can-i-use-iptables-on-centos-7 # sudo service iptabl ...
- RobotFramework做接口自动化(post请求)
接口成功时返回: { "reCorde": "SUCCESS", "data": { ", "verify": ...
- map的回调函数
问题:--js (['1','2','3']).map(parseInt) 第一眼看到这个题目的时候,脑海跳出的答案是 [1, 2, 3],但是真正的答案是[1, NaN, NaN]. 首先让我们 ...
- Windows系统下安装 CMake
在安装caffe框架的时候需要用到cmake,特将cmake的安装总结如下: 1 什么是cmake CMake是一个跨平台的编译(Build)工具,可以用简单的语句来描述所有平台的编译过程.CMake ...
- OCP 052新加的考试题收集整理-第20道
20. Which is true about the SYSTEM and SYSAUX tablespaces? A) The SYSAUX tablespace can be made read ...
- Servlet实现Cookie读写
前言 程序员老婆让程序员去外面买东西,说,老公,你出去买一笼包子吧,遇到卖西瓜的就买一个.老公高兴的出去了,一会儿带着一个包子回来了,老婆很是郁闷问,怎么只买了一个包子,程序员说:因为我看到卖西瓜的了 ...
- 【CF453D】 Little Pony and Elements of Harmony(FWT)
题面 传送门 设\(a\)的递推公式为 \[a_i=\sum_ja_jb[count(i\oplus j)]\] 其中\(\oplus\)为异或,\(count(i)\)表示\(i\)的二进制中\(1 ...
- ZooKeeper参数
原文连接:https://www.cnblogs.com/skyl/p/4854553.html ZooKeeper参数调优 zookeeper的默认配置文件为zookeeper/conf/zoo ...
- Oracle数据库count的一些操作
--统计数量 select count(*) from table; --统计某一列的数量(去空) select count(col) from table; --统计某一列的值大于或小于另一个值的数 ...
- python 数据分析 文章集锦
文本分析: re&jieba模块 使用 正则表达式 和 中文处理模块jieba 原文地址:https://www.cnblogs.com/minutesheep/p/10357209.htm ...