Go 语言入门 1-管道的特性及实现原理

入坑 go 也快一年了,从今天开始会定期分享一下 Go 语言学习过程中的一些基础知识。

go 语言中的管道, 主要是用于协程之间的通信, 比 UNIX 的管道更加轻量和易用。

我们先看一下管道的 数据结构:

<span class="code-snippet_outer"><span class="code-snippet__attribute">type hchan struct {</span></span>
<span class="code-snippet_outer">&#xA0;&#xA0;<span class="code-snippet__attribute">gcount&#xA0;&#xA0;&#xA0;uint&#xA0;&#xA0;//&#xA0;&#x73AF;&#x5F62;&#x961F;&#x5217;&#x5269;&#x4F59;&#x5143;&#x7D20;&#x4E2A;&#x6570;</span></span>
<span class="code-snippet_outer">&#xA0;&#xA0;dataqsiz&#xA0;uint&#xA0;//&#xA0;&#x73AF;&#x5F62;&#x961F;&#x5217;&#x957F;&#x5EA6;</span>
<span class="code-snippet_outer">&#xA0;&#xA0;buf&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;unsafe.Pointer // &#x73AF;&#x5F62;&#x961F;&#x5217;&#x6307;&#x9488;</span>
<span class="code-snippet_outer">&#xA0;&#xA0;elemsize&#xA0;uint16  // &#x6BCF;&#x4E2A;&#x5143;&#x7D20;&#x5927;&#x5C0F;</span>
<span class="code-snippet_outer">&#xA0;&#xA0;closed&#xA0;&#xA0;&#xA0;uint32&#xA0;&#xA0;//&#xA0;&#x6807;&#x8BC6;&#x5173;&#x95ED;&#x72B6;&#x6001;</span>
<span class="code-snippet_outer">&#xA0;&#xA0;elemtype&#xA0;*_type&#xA0;&#xA0;// &#x5143;&#x7D20;&#x7C7B;&#x578B;</span>
<span class="code-snippet_outer">&#xA0;&#xA0;sendx&#xA0;&#xA0;&#xA0;&#xA0;uint&#xA0;&#xA0;&#xA0;//&#xA0;&#x4E0B;&#x4E00;&#x4E2A;&#x5143;&#x7D20;&#x5199;&#x5165;&#x65F6;&#x7684;&#x4E0B;&#x6807;</span>
<span class="code-snippet_outer">&#xA0;&#xA0;recvx&#xA0;&#xA0;&#xA0;&#xA0;uint&#xA0;&#xA0;&#xA0;//&#xA0;&#x4E0B;&#x4E00;&#x4E2A;&#x5143;&#x7D20;&#x8BFB;&#x53D6;&#x65F6;&#x7684;&#x4E0B;&#x6807;</span>
<span class="code-snippet_outer">&#xA0;&#xA0;recvq&#xA0;&#xA0;&#xA0;&#xA0;waitq  //  &#x7B49;&#x5F85;&#x8BFB;&#x6D88;&#x606F;&#x7684;&#x961F;&#x5217;</span>
<span class="code-snippet_outer">&#xA0;&#xA0;sendq&#xA0;&#xA0;&#xA0;&#xA0;waitq  // &#x7B49;&#x5F85;&#x5199;&#x6D88;&#x606F;&#x7684;&#x961F;&#x5217;</span>
<span class="code-snippet_outer">&#xA0;&#xA0;lock&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;mutex&#xA0;&#xA0;//&#xA0;&#x4E92;&#x65A5;&#x9501;&#xFF0C;&#xA0;&#x4FDD;&#x969C;&#x7BA1;&#x9053;&#x65E0;&#x6CD5;&#x5E76;&#x53D1;&#x8BFB;&#x5199;</span>
<span class="code-snippet_outer">}</span>

源码链接:

https://github.com/golang/go/blob/0d0193409492b96881be6407ad50123e3557fdfb/src/runtime/chan.go#L33

通过上述数据结构, 我们可以理解管道是由三部分组成的:

环形队列

读写等待队列

队列元素基本信息

从管道读取数据时, 如果管道 缓冲区为空或者 没有缓冲区, 那么当前协程就会阻塞, 然后 放入 recvq 队列中。

往管道写入数据时, 如果管道 缓冲区为空或者 缓冲区满了, 那么当前协程就会阻塞, 然后 放入 sendq 队列中。

读阻塞的协程会被新来的写数据的协程唤醒。

写阻塞的协程会被新来的读数据的协程唤醒。

同时上述数据结构中, 我们可以看到一个管道中只能传递一种元素类型。 如果想数据类型动态化, 可以传递 interface。

管道的操作:

初始化有两种方式:

变量声明:

<span class="code-snippet_outer"><span class="code-snippet__keyword">var&#xA0;ch&#xA0;chan&#xA0;int&#xA0;&#xA0;</span></span>

使用 make:

<span class="code-snippet_outer"><span class="code-snippet__attribute">ch1&#xA0;:= make(chan string)  // &#x65E0;&#x7F13;&#x51B2;&#x7BA1;&#x9053;</span></span>
<span class="code-snippet_outer">ch1&#xA0;:=&#xA0;make(chan&#xA0;string&#xA0;<span class="code-snippet__number">3)  // &#x6709;&#x7F13;&#x51B2;&#x7BA1;&#x9053;</span></span>

管道的读写是通过操作符: 「

Original: https://www.cnblogs.com/guanjinglin/p/16646496.html
Author: 关靖霖
Title: Go 语言入门 1-管道的特性及实现原理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/809390/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Django+haystack+jieba进行全文检索

    最近,在做一个全文检索的功能,找了两个方案: mysql的全文检索索引 优点:配置起来简单,改mysql配置即可 缺点:无法在django使用模型生成,查询语句也无法使用orm,只…

    Python 2023年8月4日
    051
  • 06python序列

    数据结构是Python中一个很重要的概念,是以某种方式(如通过编号)组合起来的数据元素(如数字、字符乃至其他数据结构)的集合。 在Python中,最基本的数据结构是 序列(sequ…

    Python 2023年10月30日
    045
  • docker安装mongoDB及使用

    文章目录 一、mongoDB是什么? * 1. mongo的体系结构 2. mongoDB的特点(或使用场景) 3. mongoDB与mysql、redis对比 4. mongoD…

    Python 2023年9月26日
    034
  • ‘conda‘不是内部或外部命令,也不是可运行的程序或批处理文件。

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年7月31日
    056
  • Java安全之CC3

    前言 上一篇文章学习了Java中加载字节码的⼀些⽅法,其中介绍了 TemplatesImpl,TemplatesImpl 是⼀个可以加载字节码的类,通过调⽤其 newTransfo…

    Python 2023年10月15日
    064
  • 基于卷积神经网络的人脸表情识别应用–AR川剧变脸(一)

    1、摘要 本项目将在Android上实现一种通过识别表情类别,从而给人脸戴上不同样式脸谱的AR软件,效果如下: 通过深度学习和Keras训练一个人脸表情识别的卷积神经网络,然后使用…

    Python 2023年10月29日
    052
  • 通过 CancellationToken 提高 Web 性能

    在 Web 开发中,经常会遇到这样的场景:用户发起一个请求,Web 服务器执行一些计算密集型的操作,等待结果返回给用户。这种情况下,如果用户在等待结果的过程中取消了请求,那么服务器…

    Python 2023年10月12日
    036
  • Qt设计精美的登录注册界面(包含SQLite数据库应用)

    使用Qt设计美观的登录与注册界面 省流模式:如果只想要成品,点击下方链接直接下载 Login项目,导入到Qt5中可直接使用。如果想要学习设计流程可以继续往下看。 https://g…

    Python 2023年10月26日
    050
  • 聊天没有表情包被嘲讽,程序员直接用python爬取了十万张表情包

    聊天没有表情包被嘲讽,程序员直接用python爬取了十万张表情包 前言 分析页面 具体实现 * 解析页面 – 获取网页内容 解析网页内容 文件下载 – 多线…

    Python 2023年7月31日
    060
  • python list是线程不安全 deque Queue是线程安全的

    python list是线程不安全 deque Queue是线程安全的 原创 mb62b9178dc218f2022-06-27 11:03:18博主文章分类:python ©著作…

    Python 2023年5月25日
    075
  • docker k8s python flask 部署

    用python创建一个应用程序,使用docker构建镜像,使用k8s管理运行这个程序。 docker build -t k8s_python_code . docker tag k…

    Python 2023年8月13日
    050
  • C++:继承、模板、CRTP:谈谈C++多态设计模式(三):函数模板

    C++中不止有 面向对象编程思想,还要泛型编程思想。而泛型编程思想的核心就是 模板 模板的建立大大提搞了复用行,C++中的模板包括 :函数模板和类模板。 函数模板 概念:建立一个通…

    Python 2023年9月15日
    052
  • 保研笔记八——YOLOV5项目复习

    学习转载自:睿智的目标检测56——Pytorch搭建YoloV5目标检测平台_Bubbliiiing的博客-CSDN博客_睿智yolo Pytorch 搭建自己的YoloV5目标检…

    Python 2023年10月27日
    039
  • 一文了解循环神经网络

    摘要:循环神经网络(RNN)可是在语音识别、自然语言处理等其他领域中引起了变革! 循环神经网络(RNN)可是在语音识别、自然语言处理等其他领域中引起了变革! 1 应用场景 循环神经…

    Python 2023年10月21日
    032
  • Spring底层事务原理

    Spring事务底层原理 一、@EnableTransactionManagement工作原理 二、Spring事务基本执行原理 三、Spring事务的过程 四、Spring事务传…

    Python 2023年9月15日
    033
  • Django ORM 实现数据的多表 增删改查

    假定下面这些概念、字段与关系: 作者模型:一个作者有姓名和年龄。 作者详细模型:把作者的详情放到详情表,手机号,家庭住址信息。 作者详情模型 和 作者模型之间是一对一的关系(one…

    Python 2023年11月1日
    056
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球