go select 原理

编译器会使用如下的流程处理 select 语句:

  1. 将所有的 case 转换成包含 channel 以及类型等信息的 runtime.scase 结构体。
  2. 调用运行时函数 runtime.selectgo 从多个准备就绪的 channel 中选择一个可执行的 runtime.scase 结构体。
  3. 通过 for 循环生成一组 if 语句,在语句中判断自己是不是被选中的 case。
    一个包含三个 case 的正常 select 语句会被展开成以下逻辑:
selv := [3]scase{}
order := [6]uint16
for i, cas := range cases {c := scase{}c.kind = ...c.elem = ...c.c = ...
}
chosen, revcOK := selectgo(selv, order, 3)
if chosen == 0 {...break
}
if chosen == 1 {...break
}
if chosen == 2 {...break
}

最重要的是 selectgo 这个函数:

  1. 执行必要的初始化操作并决定处理 case 的两个顺序:轮询顺序 pollOrder 和加锁顺序 lockOrder。
  • 轮询顺序:通过 runtime.fastrandn 函数引入随机性。
  • 加锁顺序:按照 Channel 的地址排序后确定加锁顺序。

随机的轮询顺序可以避免 channel 的饥饿问题,保证公平性。而根据 channel 的地址顺序确定加锁顺序能够避免死锁的发生。

  1. 按照加锁顺序 lockOrder锁住所有 channel。
  2. 遍历所有的 channel,查看其是否可读或者可写。如果其中的 channel 可读或者可写,则解锁所有 channel,并返回对应的 channel 数据。
  3. 假如没有 channel 可读或者可写,但是有 default 语句,则返回 default 语句对应的 scase 并解锁所有的channel。
  4. 假如既没有 channel 可读或者可写,也没有 default 语句,则将当前运行的 groutine 阻塞,并加入到当前所有channel的等待队列中,然后解锁所有 channel,等待被唤醒。
  5. select 中一些 channel 可读或者可写了,当前 goroutine 被唤醒,并再次加锁所有channel。遍历所有channel找到那个对应的 channel 和 sudog,唤醒 sudog,并将没有成功的 sudog 从所有 channel 的等待队列中移除。
  6. 如果对应的scase值不为空,则返回需要的值,并解锁所有channel。如果对应的scase为空,则循环此过程。

select 和 channel 的关系:
在这里插入图片描述

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

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

相关文章

1W、2W 3KVAC隔离 宽电压输入 交直两用AC/DC 电源模块——TP01(02)AZ 系列

TP01(02)AZ为客户提供一款超小体积模块式开关电源,该系列模块电源输出功 率为1W、2W,具有极低的空载损耗,低漏电流仅0.1mA,小体积,隔离耐压高达 3KV等特点。产品安全可靠,EMC 性能好,EMC 及安全…

【低照度图像增强系列(7)】RDDNet算法详解与代码实现(同济大学|ICME)

前言 ☀️ 在低照度场景下进行目标检测任务,常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题,给检测带来一定的难度。 🌻使用图像增强模块对原始图像进行画质提升,恢复各类图像信息,再使用目标检测…

绝缘监测系统在1kV 及以下低压配电系统的应用

安科瑞电气股份有限公司 祁洁 acrelqj 一、系统概述 Acrel-2000L/A 绝缘监测系统设备适用于 1kV 及以下低压配电系统。该设备可以集中采集监测显示绝缘监测仪的数据,实现最多 8 个绝缘监测仪的数据,并且实时记录告警信息和曲线查询。匹配的绝缘监测仪…

搭建第一个SpringBoot+Vue项目

Maven:项目管理工具,对Java项目进行自动化的构建和依赖管理 SpringBoot的特点 只需要很少的配置或者默认配置 能够使用内嵌的Tomcat、Jetty服务器,不需要部署war文件 提供定制化的启动器Starters,简化Maven配置,开…

Spark项目实训(一)

目录 实验任务一:计算级数 idea步骤分步: 完整代码: linux步骤分布: 实验任务二:统计学生成绩 idea步骤分布: 完整代码: linux步骤分步: 实验任务一:计算级数 请…

windows2008修改远程桌面端口,如何果断修改远程桌面端口,确保系统安全无忧!

在数字化时代的浪潮中,Windows 2008系统以其卓越的稳定性和可靠性,赢得了众多企业和个人的青睐。然而,随着网络安全问题的日益严峻,如何确保远程桌面连接的安全,成为了摆在我们面前的一道难题。今天,我将为…

理解大语言模型(二)——从零开始实现GPT-2

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型:从线性回归到通用人工智能》,欢迎有兴趣的读者多多支持。 本文涉及到的代码链接如下:regression2chatgpt/ch11_llm/char_gpt.ipynb1 本文将讨论如何利用PyTorch从零开始搭建G…

VMware VCP VCAP认证已经不需要培训记录了

之前,VMware的VCP、VCAP认证,必需花上万银子参加培训才能参加考试拿证书;但从今年5月6号开始,只需要参加考试就可以了,不再需要这个培训记录了。 而且,VCTA、VCP、VCAP各等级的考试费统一了,都…

【Qt常用控件】—— 布局管理器

目录 前言 (一)垂直布局 (二)水平布局 (三)网格布局 (四)表单布局 (五)分组布局 (六)Spacer 总结 前言 之前使⽤Qt在界⾯上…

申请公众号数量达标

一般可以申请多少个公众号?目前企业主体只能申请2个公众号,这也意味着想做矩阵公众号的难度提升了。有些公司靠着诸多不同分工的公众号形成一个个矩阵,获取不同领域的粉丝。比如,目前主体为xx旗下公众号,共有30个&…

3.1 掌握RDD的创建

在Apache Spark中,RDD(Resilient Distributed Dataset)是一个基本的、不可变的、分布式的和可分区的数据集。它能够自动进行容错处理,并支持在大规模集群上的并行操作。RDD之间存在依赖关系,可以实现管道化&#xff0c…

Mysql-存储引擎、索引、SQL优化和视图

存储引擎 mysql体系结构 连接层 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层 第二层架构主要完成大多数的核心服务功能,如SQL接口&#…

倪海夏的思维逻辑总结

1《天纪》是自然法则,自然法则是个《真理》, 《真理》不需要再证实,《真理》没有二元对立。 《真理》没有例外。 2研究任何学问(事物),批判去看,假设--验证--结果。 以果决其行&#xff0…

10个顶级的论文降重指令,让你的论文降重至1.9%

10个顶级的论文降重指令,本硕博写论文必备! 在ChatGPT4o对话框中输入:写一个Spring BootVue实现的车位管理系统的论文大纲,并对其具体章节进行详细描述。 几小时即可完成一份1万字论文的编写 在GPTS中搜索论文降重,使…

Milvus 使用过程中的常见问题集锦

引言 在使用Milvus的过程中,可能会遇到一些常见问题。这些问题可能涉及到配置、查询、数据同步等方面。 常见问题 以下是一些可能遇到的常见问题及其解决方法: 查询结果不正确: 可能原因:Milvus内部缓存与数据不一致&#xff0…

2024 电工杯高校数学建模竞赛(B题)数学建模完整思路+完整代码全解全析

你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的数学建模团队,我们将为你带来2024电工杯数学建模竞赛(B题)的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解…

Aware接口作用

介绍 Aware(感知)接口是一个标记,里面没有任何方法,实际方法定义都是子接口确定(相当于定义了一套规则,并建议子接口中应该只有一个无返回值的方法)。 我们知道spring已经定义好了很多对象,如…

2024 电工杯高校数学建模竞赛(A题)| 储能配置 |建模秘籍文章代码思路大全

铛铛!小秘籍来咯! 小秘籍团队独辟蹊径,运用负载均衡,多目标规划等强大工具,构建了这一题的详细解答哦! 为大家量身打造创新解决方案。小秘籍团队,始终引领着建模问题求解的风潮。 抓紧小秘籍&am…

微信小程序uniapp+django洗脚按摩足浴城消费系统springboot

原生wxml开发对Node、预编译器、webpack支持不好,影响开发效率和工程构建。所以都会用uniapp框架开发 前后端分离,后端给接口和API文档,注重前端,接近原生系统 使用Navicat或者其它工具,在mysql中创建对应名称的数据库&#xff0…

cn.hutool.poi.excel 实现excel导出效果 首行高度,行样式,颜色,合并单元格,例子样式

需求 接了需求,下载excel模版,本来看着还是简单的,然后实现起来一把泪,首先是使用poi,我查了好久,才实现,然后是我用easyexcel又实现了一遍,用了一个周多才实现。 这是需求&#x…