Golang-channel理解

channel


golang-channel语雀笔记整理

  • channel
    • golang channel的设计动机?
    • chanel的数据结构/设计思考

golang channel的设计动机?

channel是一种不同协程之间实现异步通信的数据结构。
golang中有一种很经典的说法是要基于通信实现共享内存,而不要基于共享内存实现通信。在操作系统内核视角下,线程是最小调度单元,不同线程共享内存空间这样实现的通信就很方便,但并不是共享的细节越多越好,好的架构应该是只共享对方需要关心的细节。
chanel通过语法级别上的消息队列实现共享,通过很简洁的api将需要关心的细节托付给channel,而不需要暴露所有细节。

chanel的数据结构/设计思考

所以综上可以推断channel的数据结构:

  • channel需要面向并发实现异步通信,所以肯定有一把锁;
  • chanel需要缓存数据的能力(比如定义的时候可以定义cap大小),所以一定有buf(通过双指针和一个数组实现的环形数组。双指针一个标记读从哪里开始,一个标记写从哪里开始。数组保证内存连续所以快,相比链表,省去了存放前后指针的空间,环形保证内存复用);
  • channel需要有阻塞的功能,比如某个读协程由于channel没数据读,所以阻塞挂起了,后续channel有内容可读了如何找到这个协程并且唤醒?那么需要一种数据结构承载并且维护和管理协程,所以有阻塞的协程队列

image.pngimage.png

channel阻塞问题:
往无缓冲channel中 读,但是没有数据并且不写,阻塞
往有缓冲channel中读, 但是缓冲为空,阻塞
往无缓冲中写,但是没有协程读,阻塞
往有缓冲中写,缓冲满了还没读,阻塞
有数据但是没读,close掉还是会阻塞

读的两种协议:读的时候如果 val <- chan,此时的读到0,是因为无数据可读还是因为关闭了?
所以 val , ok <- chan, 如果ok为ture,此时的0是数据0,ok为false,0是无数据可读的0

chanel的close
image.png

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

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

相关文章

机器学习基础:开源库学习-Numpy科学计算库

目录 Numpy科学计算库 什么是多维数组 数组基础 高维数组 操作和创建数组 Numpy介绍 创建数组 数组的属性 二维数组 三维数组 数组元素的数据类型 创建特殊的数组 np.arange() np.ones() np.zeros() np.eye() np.linspace() np.logspace() asarray() 数组运…

AUTOSAR汽车电子嵌入式编程精讲300篇-智能网联汽车CAN总线-基于电压信号的CAN总线入侵检测系统设计与实现

目录 前言 入侵检测系统研究现状 入侵检测系统建模 CAN总线 入侵检测威胁模型 Deep SVDD模型 入侵检测系统方案设计 挑战和解决方案 差分信号的采集与处理 差分信号的特征提取 入侵检测模型的设计 入侵检测系统性能评估 实验环境设置 不同的车辆状态 不同数量的…

一致性哈希算法golang版本

什么是一致性哈希 一致性哈希&#xff08;Consistent Hashing&#xff09;是一种分布式系统中常用的算法&#xff0c;用于在节点&#xff08;如缓存服务器&#xff09;之间均匀分配数据。它的核心思想是将所有可能的哈希值组织成一个环形结构&#xff0c;并将数据和节点通过哈…

005 参数绑定处理

文章目录 参数绑定默认支持的参数类型参数绑定使用要求简单类型RequestParam注解 绑定POJO类型绑定集合或者数组类型 参数绑定示例JSP代码Controller代码PO代码 自定义日期参数绑定Converter代码Converter配置 文件类型参数绑定加入依赖包上传页面配置Multipart解析器Controlle…

thymeleaf+mybatis(本文章用于期末考前10分钟速看)

期末速看 pom&#xff08;了解&#xff09;application.propertiessql代码Controller控制层视图service&#xff1a; 服务层mapper&#xff08;dao&#xff09;&#xff1a;持久层entity层(model层&#xff0c;domain层、 bean)&#xff1a;对应数据库表&#xff0c;实体类 效果…

谈谈你对AQS的理解

AQS概述 AQS&#xff0c;全称为AbstractQueuedSynchronizer&#xff0c;是Java并发包&#xff08;java.util.concurrent&#xff09;中一个核心的框架&#xff0c;主要用于构建阻塞式锁和相关的同步器&#xff0c;也是构建锁或者其他同步组件的基础框架。AQS提供了一种基于FIF…

模拟城市5: 未来之城 全DLC for Mac 下载安装包

模拟城市5&#xff1a;未来之城&#xff08;SimCity BuildIt&#xff09;是一款由Maxis开发并由 Electronic Arts&#xff08;EA&#xff09;发行的城市建设和管理模拟游戏。这款游戏最初在2014年发布&#xff0c;适用于iOS、Android以及Windows Phone平台&#xff0c;随后在20…

力扣最新详解5道题:两数之和三数之和四数之和

目录 一、查找总价格为目标值的两个商品 题目 题解 方法一&#xff1a;暴力枚举 方法二&#xff1a;对撞指针 二、两数之和 题目 题解 方法一&#xff1a;暴力枚举 方法二&#xff1a;哈希表法 三、三数之和 题目 题解 方法一&#xff1a;排序暴力枚举set去重 …

数据资产治理的智能化探索:结合云计算、大数据、人工智能等先进技术,探讨数据资产治理的智能化方法,为企业提供可靠、高效的数据资产解决方案,助力企业提升竞争力

一、引言 在信息化时代&#xff0c;数据已成为企业最重要的资产之一。随着云计算、大数据、人工智能等先进技术的飞速发展&#xff0c;数据资产治理面临着前所未有的机遇与挑战。本文旨在探讨如何结合这些先进技术&#xff0c;实现数据资产治理的智能化&#xff0c;为企业提供…

【活动感想】筑梦之旅·AI共创工坊 workshop 会议回顾

目录 &#x1f30a;1. 会议详情 &#x1f30a;2. 会议回顾 &#x1f30d;2.1 主持人开场 &#x1f30d;2.2 元甲-小当家 AI 驱动的创意儿童营养早餐料理机&今天吃什么App &#x1f30d;2.3 Steven- A l 心理疗愈认知 &#x1f30d;2.4 伯棠-诸子百家(xExperts)-多智能…

C++ 文件读写

目录 一、XML文件读写 1、写入XML文件 2、读取XML文件 二、JSON文件读写 1、写入JSON文件 2、读取JSON文件 3、写入JSON文件 4、读取JSON文件 三、CSV文件读写 1、写入CSV文件 2、读取CSV文件 四、Excel文件读写 1、写入Excel文件 2、读取Excel文件 五、INI文件读…

转盘输入法-总

序 转盘输入法&#xff0c;给你的聊天加点新意。它不用常见的九宫格或全键盘&#xff0c;而是把字母摆在圆盘上&#xff0c;一滑一滑&#xff0c;字就出来了&#xff0c;新鲜又直接。 PC屏幕键盘的对比 鉴于屏幕键盘这一新颖界面的局限性&#xff0c;当用户在操作时&#xff…

015、HBase分布式数据库与传统数据库的深度对比

目录 HBase分布式数据库与传统数据库的深度对比 1. 数据模型 1.1 传统关系型数据库 1.2 HBase 2. 扩展性 2.1 传统关系型数据库 2.2 HBase 3. 查询语言 3.1 传统关系型数据库 3.2 HBase 4. 事务支持 4.1 传统关系型数据库 4.2 HBase 5. 数据一致性 5.1 传统关系型…

STM32 HAL库里 串口中断回调函数是在怎么被调用的?

跟着正点原子学习的HAL库写串口接收程序的时候一直有困惑&#xff0c;使用HAL_UART_Receive_IT开启接收中断后&#xff0c;为啥处理函数要写在HAL_UART_RxCpltCallback里&#xff0c;中断发生的时候是怎么到这个回调函数里去的&#xff1f; void MX_USART1_UART_Init(void) {h…

Elasticsearch环境搭建|ES单机|ES单节点模式启动|ES集群搭建|ES集群环境搭建

文章目录 版本选择单机ES安装与配置创建非root用户导入安装包安装包解压配置JDK环境变量配置single-node配置JVM参数后台启动|启动日志查看启动成功&#xff0c;访问终端访问浏览器访问 Kibana安装修改配置后台启动|启动日志查看浏览器访问 ES三节点集群搭建停止es服务域名配置…

C++面试题精选-2024/06/26

堆分配会比栈快吗 堆分配和栈分配在速度上并不直接可比,因为它们服务于不同的目的和场景,具有不同的特性和优势。以下是关于堆分配和栈分配速度方面的详细分析: 数据结构: 栈是一种线性数据结构,遵循先进后出(LIFO)的原则。堆则是一种树状的数据结构,允许随机插入和删…

【SGX系列教程】(二)第一个 SGX 程序: HelloWorld,linux下运行

文章目录 0. SGX基础原理分析一.准备工作1.1 前提条件1.2 SGX IDE1.3 基本原理 二.程序设计2.1 目录结构2.2 源码设计2.2.1 Encalve/Enclave.edl:Enclave Description Language2.2.2 Enclave/Enclave.lds: Enclave linker script2.2.3 Enclave/Enclave.config.xml: Enclave 配置…

Elasticsearch 管道聚合:组合多个聚合

在Elasticsearch中&#xff0c;聚合&#xff08;Aggregations&#xff09;是处理和分析大量数据的关键工具。通过聚合&#xff0c;我们可以从海量的数据中提取出有价值的统计信息&#xff0c;如最大值、最小值、平均值、总和等。然而&#xff0c;有时单一聚合无法满足我们复杂的…

C语言之字符串存储差异分析

C语言之字符串存储差异分析 字符串字符串字面量字符数组动态分配字符串 结语 字符串 在C语言中&#xff0c;可以使用多种方式来创建字符串。但是&#xff0c;不同创建方式之间的区别&#xff0c;你了解么&#xff1f;。 字符串字面量 C语言 -- 字符串字面量创建方式 char *s…

Games101学习笔记 Lecture 14: Ray Tracing 2 (Acceleration Radiometry)

Lecture 14: Ray Tracing 2 (Acceleration & Radiometry 一、加速光线追踪 AABB1.均匀网格 Uniform Spatial Partitions (Grids)①前处理-构建加速网格②射线与场景相交③网格分辨率④适用情况 2.空间划分KD-Tree①预处理②数据结构③遍历④问题 3.对象划分 & 包围盒层…