channel
一、channel
1. 前言
channel是Golang在语言层面提供的goroutine间的通信方式,比Unix管道更易用也更轻便。channel主要用于进程内各goroutine间通信,如果需要跨进程通信,建议使用分布式系统的方法来解决。
2.分类
2.1 带缓冲
带缓冲的channel,只有等缓冲区满了后才会阻塞;
读取一个关闭的channel,会读取到空值;
写入一个已经关闭的channel,会导致死锁;
2.2 不带缓冲
读取/写入一个为nil的channel,会导致阻塞;
读取一个关闭的channel,会读取到空值;
写入一个已经关闭的channel,会导致死锁;
3. 数据结构
1 |
|
3.1 环形队列
chan内部实现了一个环形队列作为其缓冲区,队列的长度是创建chan时指定的。
3.2 等待队列
3.3 实现原理和特性
3.3.1. 全局锁
3.3.2. 移入、移除元素
二、select
1 |
|
注意如果signals1和signals2的信号过来,case的执行顺序是随机的。
channel
https://www.zengzx.xyz/2019/12/22/01.知识架构/01.Go/01.基础/03.并发编程/