上一篇已经简单把Go的基本语法特性说了, 这篇来单独说Go最吸引普通人的特性, 原生的用户态并发
0x00.并发
1. 前言
任何语言的并发编程, 都不会是一件简单的事, 这里说的简单是指:
- 会用
- 懂原理
- 有问题会排查
Go在这侧重解决的是第一点,
Go的并发模型是通过系统的线程来多路派遣这些独立的函数执行 ,使德每个使用goroutine 的函数可以运行成为一个单位协程 . 当一个协程阻塞的时候,调度器就会自动把其他协程安排到另外的线程中去执行.从而实现程序的无等待并行运行. 并且调度的开销非常小,单核CPU下调度规模 > 百万次/s. 使得开发者能创建大量的goroutines ,轻松编写高并发程序.
1 | //使用go关键字就可以实现并发开始了. 开始可以简单类比为java中的Thread(线程) , 但是实际不一样 |
2. goroutine
首先把基本的名词和读法搞清楚, 不然学了半天Go还是闹笑话, 首先goroutine这是个组合词 –> go + routine[ˌruˈtin], 它的参考来源是协程(coroutine), 那你就要明白, 之所以严谨说Go的并发不能直接用协程简而代之, 就是因为它并非是同一个实现, 从命名也知道
goroutine可以理解为是基于协程的基础, 融合了其他概念(线程)的实现, 所以如无必要, 尽量不要把它翻译为协程, 或者和CPS混在一起.
关于并发的补充:
goroutine+CPS并不能完全解决并发的竞态(race condition)问题, 计算机世界没有银弹- go原生提供了一套单独的同步机制
sync包. 类似java中的concurrent库
0x01. channel
Channel [ˈtʃæn(ə)l]一般翻译为通道, 但是尽量别翻译为管道(pipe), 容易有歧义. 本质是一个队列, 类似生产/消费模型里的通道
关键字是chan 也是go在语言级别的实现,可以存储/读取信息
1 | package main |
0x02. select
同理, 说select之前, 先把这个名词的由来说清楚, 对有一点基础的同学来说, 编程里看到select 关键字, 容易联想到:
- C中的select关键字
- 网络编程中的
select-poll模型
0x04. 并发模型
这里待补充, 初学可以先不太细究, 但是它是你真正理解Go并发设计的核心, 不然你写的并发程序一定
0x05. 继续反思
待补充
参考资料: