新年学新语言Go之一

一、前言

搜索相关知识后续内容等上班后再继续,新年新气象,从今天开始学习一下Go语言,第一次听说这门语言还是2016年的时候,然后2018年买了一本书  Go In Action,然后就没有然后了, 转眼这么多年过去了,Go语言因为在服务端开发并发方面相当有优势,现在很多公司都在用,另外为了不浪费买书的钱,也有必要把Go语言学习一下,今天先了解一下Go语言这个最重要一个特性。

注:Docker和Consul都是Go开发的,Docker的使用可以看以前一些文章,还有几篇没写完。

二、几个概念

1、并发

在一个CPU上同时执行多个任务,在很短时间内CPU来回切换任务执行(可以理解为有的任务在等待IO暂时不用CPU资源),这样在时间上宏观来看是同时执行,但微观上对于CPU来讲还是顺序执行的,这就是并发。

2、并行

当系统有多个CPU时,每个CPU在同一时刻运行不同任务,互不抢占CPU资源,同时执行,这就是并行。

3、进程

有独立功能的程序关于某个数据集合一次运行活动,每个进程有自己独立的内存空间,进程间切换开销相对比较大,不同进程通过进程间通信来交互。

4、线程

可以理解为轻量级进程, 是进程的一个实体,也是CPU调度基本单位,线程基本上不拥有静态系统资源,只拥有一些运行时必不可少的资源(程序计数器、栈、寄存器),线程之间切换开销相对较小,线程间通信主要通过共享内存。

注:Redis采用的是单线程,这是因为它是基于内存的,CPU并不是它的瓶颈。

5、协程

用户态轻量级线程,协程并不是被操作系统内核所管理而是完全由用户程序所控制,这样协程切换时开销更小。

注:关于协程的概念,很久以前听毕玄做HSF分享时讲过,但协程好像在Java领域一直没有流行起来,或许可能只是因为我没有接触过。

6、CSP模型

于描述两个独立的并发实体通过共享通道(Channel)进行通信的并发模型,它不需要像多线程那样通过对数据进行加锁来进行同步访问。

三、Go并发机制

Go语言对并发的支持是它最重要的特性之一,它主要使用了CSP模型中两个概念

1、goroutine

goroutine是并发执行的实体,它的底层使用协程来实现并发,Go使用协程来处理并发,是因为协程一些优势,首先协程由用户空间管理避免了内核态用用户态切换成本,其二协程由语言框架层进行调度,其三可以在很小的空间创建大量的协程实例。

2、channel

channel通道是一种数据结构,用于goroutine之间进行安全的数据通信,有点类似于消息队列,一个goroutine将消息发送到channel,然后被另外一个goroutine消费掉,感觉就像是一个阻塞的消息队列。

3、Go调度器 GMP

go语言为goroutine提供语言层面的调度器,实现高效率的用户线程和内核线程多对多的关系。

新年学新语言Go之一_第1张图片

G:待执行的goroutine,包含这个goroutine的栈空间。

M:内核线程。

P:是调度协调,用于协调M和G的执行,内核线程只有拿到了 P才能对goroutine继续调度执行,一般都是通过限定P的个数来控制golang的并发度。

下一篇再通过一个简单的并发例子来理解Go对并发的处理。

杭州又下雪了,很美,看雪去吧!

你可能感兴趣的:(Python&Go,golang,开发语言,后端)