Golang Channel底层实现原理

1、本文讨论Channel的底层实现原理

首先,我们看Channel的结构体

在这里插入图片描述

简要介绍管道结构体中,几个关键字段

在Golang中,管道是分为有缓冲区的管道和无缓冲区的管道。

这里简单提一下,缓冲区大小为1的管道和无缓冲区的管道的区别,如果是

缓冲区大小为1的管道,发送者A发送数据后,发送者A可以去干其它行为,但是别的发送者想发送数据,会阻塞。对于发送者A来说,这是一个非阻塞行为

无缓冲区的管道的区别,发送者A发送数据后,发送者A会被阻塞,直到管道数据被读取,发送者A才会被唤醒,对于发送者A来说,这是一个阻塞行为

回归正题buf是一个指针变量,当有缓冲区时,指向保存数据的底层数组sendx指的是,当前管道发送数据最后位置recvx是当前管道接收数据的最后一个位置,其实这样就构成了一个循环队列,如图
在这里插入图片描述

recvq是等待接收队列,该队列实现的数据结构是双链表,链表节点可以理解成协程,保存的是被管道阻塞的协程。

sendq是等待发送队列,该队列实现的数据结构是双链表,链表节点可以理解成协程,保存的是被管道阻塞的协程。

其实管道可以理解成数据通信方式中的共享空间,对于共享空间的变量读写,为了保证并发数据的一致性,所以需要加锁,所以lock字段就是锁,而且是悲观锁

所以 管道 收发数据是要加锁的

再给大家分享一些关于管道的理解吧

(1)当向未关闭,但是缓冲区已满的管道发送数据,或者缓冲区为空的管道读取数据就会阻塞,阻塞的协程加入感到的发送等待队列或接收等待队列

(2)使用channel的时候,也需要注意管道是否会发生gorountine泄漏,比如一个G****一直阻塞在一个不会改变状态的管道的时候,这个G不会结束,这个G的内存空间无法回收。一个G的内存空间大概就几KB,但是还是取决于你的栈有多大。

(3)包括关闭channel的时候,关闭channel的原则主要有
----①不要已关闭的管道发送数据
----②不要关闭已关闭的管道
----③所以,关闭管道主要有以下几个场景
--------1)如果是一个发送者,都让发送者关闭
--------2)如果是多个发送者,一个接收者
----------------a.可以是用一个传递信号的管道,让每个发送者去for+select去监听,然后接收者负责关闭 传递信号 的管道。当接收者关闭这个管道,发送者那边select的case最终肯定会进入,然后让发送者退出。这里面并不去实际关闭传送数据的管道
--------3)如果是多个发送者,多个接收者
----------------a.可以用一个中间人,去接收关闭信号,然后去关闭传递信号的管道,关闭后这个中间人协程就退出。任一发送者、接收者都可以发送关闭的信号,全部发送者、接收者都for+select监听关闭信号的管道,和多个发送者、一个接收者类型,通过中间人 只关闭一次,避免了重复关闭导致的Panic
-------4)如果多个发送者都由一个父协程产生的,那就让父协程来关闭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/511914.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android14之BpBinder构造函数Handle拆解(二百零四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

详解人工智能(概念、发展、机遇与挑战)

前言 人工智能(Artificial Intelligence,简称AI)是一门新兴的技术科学,是指通过模拟、延伸和扩展人类智能的理论、方法、技术和应用系统,以实现对人类认知、决策、规划、学习、交流、创造等智能行为的模拟、延伸和扩展…

Linux 线程互斥、互斥量、可重入与线程安全

目录 一、线程互斥 1、回顾相关概念 2、抢票场景分析代码 多个线程同时操作全局变量 产生原因 如何解决 二、互斥量 1、概念 2、初始化互斥量: 方法1:静态分配 方法2:动态分配 3、销毁互斥量: 4、加锁和解锁 示例抢…

MySQL 8.0.13安装配置教程

写个博客记录一下,省得下次换设备换系统还要到处翻教程,直接匹配自己常用的8.0.13版本 1.MySQL包解压到某个路径 2.将bin的路径加到系统环境变量Path下 3.在安装根目录下新建my.ini配置文件,并用编辑器写入如下数据 [mysqld] [client] port…

基于jsp网上教师点评系统

基于jsp网上教师点评系统 关键词:教师点评 信息技术 JSP技术 系统实现 首页 评分规则 教室信息 后台首页 相关技术介绍 B/S架构 对于架构,听起来说我们可能比较陌生,但对于通俗的语法讲。他的访问方式是通过网址还是说通过点图标这…

YoloV8改进策略:Neck改进|GCNet(独家原创)|附结构图

摘要 本文使用GCNet注意力改进YoloV8,在YoloV8的Neck中加入GCNet实现涨点。改进方法简单易用,欢迎大家使用! 论文:《GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond》 非局部网络(NLNet)通过为每个查…

Flex布局:打造灵动、响应式网页设计的利器

Flex布局(Flexible Box Layout),也称为弹性盒布局,是一种现代CSS布局模式,旨在为复杂、响应式的网页设计提供更加灵活、简洁的解决方案。Flex布局通过定义一个弹性容器(flex container)及其内部…

49岁前港姐退圈出嫁「南丫岛王子」,打排卵针高龄连生两女。

现年49岁的吴忻熹(原名吴文忻)1998年参选香港小姐夺得季军入行,在TVB签约发展平平,继而转战影坛,凭性感演出而为人熟悉。其后她在2011年嫁给有「南丫岛王子」之称的金融才俊,并在近40岁开始诞下两名女儿。吴…

Set a Light 3D Studio:探索光影艺术的全新维度mac/win中文版

Set a Light 3D Studio 是一款领先的三维建模和渲染软件,它将设计师、艺术家和摄影师的创意想法转化为生动逼真的三维场景。这款软件以其强大的功能和直观的界面,成为行业内众多专业人士的首 选工具。 set.a.light 3D STUDIO中文版软件获取 在Set a Lig…

最简单的 AAC 音频码流解析程序

最简单的 AAC 音频码流解析程序 最简单的 AAC 音频码流解析程序原理源程序运行结果下载链接参考 最简单的 AAC 音频码流解析程序 参考雷霄骅博士的文章:视音频数据处理入门:AAC音频码流解析 本文中的程序是一个AAC码流解析程序。该程序可以从AAC码流中…

信息系统项目管理师——第17章项目干系人管理

本章节内容属于10大管理知识领域,选择、案例、论文都会考。 选择题,稳定考1-2分左右,新教材基本考课本原话,这个分不能丢。 案例题,本期考的概率一般。 论文题,202205期考过。 1管理基础 管理的重要性 为…

QT5-qmediaplayer播放视频及进度条控制实例

qmediaplayer是QT5的播放视频的一个模块。它在很多时候还是要基于第三方的解码器。这里以Ubuntu系统为例,记录其用法及进度条qslider的控制。 首先,制作一个简单的界面文件mainwindow.ui: 然后,下载一个mp4或其他格式视频&#x…

爬虫 红网时刻 获取当月指定关键词新闻 并存储到CSV文件

目标网站:红网 爬取目的:为了获取某一地区更全面的在红网已发布的宣传新闻稿,同时也让自己的工作更便捷 环境:Pycharm2021,Python3.10, 安装的包:requests,csv,bs4&…

计算多个元素的累乘结果累乘器start默认初始为1 math.prod()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算多个元素的累乘结果 累乘器start默认初始为1 math.prod() [太阳]选择题 请问题目中的代码最后输出什么? import math list1 [1, 2, 3] print("【显示】list1 ",list1) pri…

如何将本地仓库放到远程仓库中

在我们仓库创建好之后&#xff0c;我们复制好ssh 接着我们需要使用git remote add<shortname><url>这个命令 shortname就是我们远程仓库的别名 接着使用git remote -v这个命令查看一下目前远程仓库的别名和地址 原本还有一个指令git branch -M main 指定分支的名…

智能试卷分析、智能组卷系统

本课题开发一个新型智能试卷分析评价系统&#xff0c;该系统实现了学生试卷的生成与评估以及对各种评估信息的管理和维护。该系统使用SpringBoot MysqlVue搭建的框架为设计平台&#xff0c;以B/S模式开发与设计题库及试卷管理模块。 学生功能&#xff1a;登录&#xff0c;答题考…

RD55UP06-V 三菱iQ-R系列C语言功能模块

RD55UP06-V 三菱iQ-R系列C语言功能模块 RD55UP06-V用户手册&#xff0c;RD55UP06-V功能&#xff0c;RD55UP06-V系统配置 RD55UP06-V参数规格&#xff1a;10BASE-T/100BASE-TX/1000BASE-T 1通道&#xff1b;字节存储次序格式小端模式; 可使用SD存储卡插槽&#xff1b;工作RAM 1…

dddddd

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

vulhub打靶记录——healthcare

文章目录 主机发现端口扫描FTP—21search ProPFTd EXPFTP 匿名用户登录 web服务—80目录扫描search openemr exp登录openEMR 后台 提权总结 主机发现 使用nmap扫描局域网内存活的主机&#xff0c;命令如下&#xff1a; netdiscover -i eth0 -r 192.168.151.0/24192.168.151.1…

更高效、更简洁的 SQL 语句编写丨DolphinDB 基于宏变量的元编程模式详解

元编程&#xff08;Metaprogramming&#xff09;指在程序运行时操作或者创建程序的一种编程技术&#xff0c;简而言之就是使用代码编写代码。通过元编程将原本静态的代码通过动态的脚本生成&#xff0c;使程序员可以创建更加灵活的代码以提升编程效率。 在 DolphinDB 中&#…