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)如果多个发送者都由一个父协程产生的,那就让父协程来关闭

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

维基百科推广方法及注意事项解析-华媒舍

1. 维基百科 维基百科是一个自由而开放的在线百科全书,由志愿者共同创建和编辑。它是全球最大的百科全书,包含了广泛的主题和知识。作为一个公共平台,维基百科是广告和宣传的禁区,但它可以是一个有效的推广工具,帮助您…

ENSP华为防火墙WEB登录操作指南

ENSP华为防火墙WEB登录操作指南 华为防火墙登录WEB 1、华为防火墙配置:(需要在互联接口下放通https和ping) int g0/0/0 service-manage https permit service-manage ping permit 2、电脑需要配置虚拟网卡 3、虚拟网卡与云和防火墙配置的IP地…

【学习心得】Numpy学习指南或复习手册

本文是自己在学习Numpy过后总是遗忘的很快,反思后发现主要是两个原因: numpy的知识点很多,很杂乱。练习不足,学习过后一段时间不敲代码就会忘记。 针对这两个问题,我写了这篇文章。希望将numpy的知识点织成一张网&…

【Vmware】 debian 12 安装教程

1.前提说明 VMware 17.5.1 (自行安装),参考Debian 12maven 3.8.7git 2.39.2jdk 1.8 / 11 / 17 1.1.Debian 下载 访问(https://www.debian.org/download) 下载 Debian 这是 Debian 12,代号为 bookworm,网络安装,用于 64 位 PC&a…

机器学习算法与应用

机器学习是人工智能领域中的一个重要分支,它通过构建和训练模型来使计算机系统具备从数据中学习并做出预测或决策的能力。在这篇博客中,我们将深入探讨机器学习算法的基本原理、常见类型以及在实际应用中的案例。 机器学习算法概述 介绍机器学习的基本概…

PLC通过Modbus转Profine网关接温度传感器方案

Modbus转Profinet网关用于实现Modbus协议和Profinet协议之间的数据转换和传输。Modbus转Profinet网关接温度传感器的方案主要涉及将Modbus协议的温度传感器数据转换为Profinet协议,以便与工业自动化系统中的其他设备进行通信和数据交换。 以下是实现此方案的基本步骤…

[StartingPoint][Tier0]Mongod

Task 1 How many TCP ports are open on the machine? (机器上打开了多少个 TCP 端口?) Example: $ sudo nmap -sS -T4 10.129.222.112 -p 27017,22 2 Task 2 Which service is running on port 27017 of the remote host? (哪个服务正在远程主机的端口 270…

系统架构设计师-23年-论文题目

系统架构设计师-23年-论文题目 更多软考知识请访问 https://ruankao.blog.csdn.net/ 摘要字数在400字以内,可以分条叙述,但不允许有图、表、流程图。 正文字数为2000字至300字,文中可以分条叙述,但不要全部用分条叙述的方式。 …

设计模式总结-面向对象设计原则

面向对象设计原则 面向对象设计原则简介单一职责原则单一职责原则定义单一职责原则分析单一职责原则实例 开闭原则开闭原则定义开闭原则分析开闭原则实例 里氏代换原则里氏代换原则定义里氏代换原则分析 依赖倒转原则依赖倒转原则定义依赖倒转原则分析依赖倒转原则实例 接口隔离…

向量旋转操作之分段递归交换

开篇 这是对于之前一维向量左旋操作问题的最后一个解法,也是关于这个问题的最后一篇文章。在之前的文章中,我们分别用求逆法、取模置换法对该问题进行了解答,今天,使用的是分段递归的方式。 问题概要 将一个n元一维向量向左旋转i个…

深入了解JUnit 5:新一代Java单元测试框架

深入了解JUnit 5:新一代Java单元测试框架 近年来,Java领域的单元测试框架发展迅速,而JUnit 5作为JUnit系列的最新版本,为开发人员提供了更多的功能和灵活性。在本文中,我们将介绍JUnit 5,并探讨其与JUnit 4…

探索数据库-------MYSQL故障排除与优化

目录 mysql逻辑架构图 一、MySQL 数据库故障 1.1 MySQL 单实例故障排查 1.1.1故障现象 1 1.1.2故障现象 2 1.1.3故障现象 3 1.1.4故障现象 4 1.1.5故障现象 5 1.1.6故障现象 6 1.1.7故障现象 7 1.1.8故障现象 8 1.2MySQL 主从故障排查 1.2.1故障现象 1 1.2.2故障…

电感与磁珠的区别以及在EMC的作用

电感与磁珠的区别以及在EMC的作用 电感的定义和特性电感的频率特性噪声对策方法电感的直流叠加饱和绕组型电感的特性 电感的定义和特性 电感是能够把电能转化为磁能而存储起来的元器件。电感器具有一定的电感,它只阻碍电流的变化。电感器又称扼流器、自电抗器、动态…

Cocos Creator 定时任务

目录 Javascript 内置定时器 Cocos 计时器 update 函数 参考 Javascript 内置定时器 setTimeout, setInterval Cocos 计时器 先创建一个指向某个组件的变量,变量名为 component 开始一个计时器 component.schedule(function() {// 这里的 this 指…

02 OSI和TCP/IP参考模型

OSI参考模型优点: 1. 分层结构:OSI参考模型将网络通信划分为七个不同的层次,每个层次都有特定的功能和责任。这样的分层结构使得网络通信变得模块化,易于理解、设计和维护。 2. 标准化:OSI参考模型的制定依据了通信领…

NPW(监控片的)的要点精讲

半导体的生产过程已经历经数十年的发展,其中主要有两个大的发展趋势,第一,晶圆尺寸越做越大,到目前已有超过70%的产能是12寸晶圆,不过18寸晶圆产业链推进缓慢;第二,电子器件的关键尺寸越做越小&…

《QT实用小工具·五》串口助手

1、概述 源码放在文章末尾 该项目实现了串口助手的功能,可在界面上通过串口配置和网络配置进行串口调试。 基本功能 支持16进制数据发送与接收。支持windows下COM9以上的串口通信。实时显示收发数据字节大小以及串口状态。支持任意qt版本,亲测4.7.0 到…

【Canvas与艺术】绘制“Best Product Guaranteed”标志

【图示】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>用Canvas绘制“Best Product Guaranteed”标志</title><sty…

剖析C++中的继承

剖析C继承 文章目录 剖析C继承前言一、继承的概念1. 概念2. 定义方式3. 注意要点 二、基类与派生类对象赋值转换三、继承中的作用域四、基类与派生类默认成员函数调用关系五、继承与友元函数六、继承与静态成员七、菱形继承总结 前言 ​ 继承是C中非常重要的一大特性&#xff…

一分钟了解MOS管基础知识

场效应管&#xff08;Field-Effect Transistor&#xff0c;简称FET&#xff09;是电子技术中广泛使用的一种半导体器件&#xff0c;具有高输入阻抗、噪声低和低功耗等优点。 简介 场效应管是一种电压控制器件&#xff0c;其工作原理是通过改变栅极&#xff08;Gate&#xff09;…