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 的关系:
在这里插入图片描述

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

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

相关文章

AIGC:AI整活!万物皆可建筑设计

在过去的一年里 AI设计爆火 各行业纷纷将之用于工作中 同时不少网友也在借助它整活 万物皆可设计 甲方骂我方案像屎一样 于是我就回馈他屎一样的方案 他有点惊喜,但是没话 不是吧,随便找了个充电头图片 也能生成建筑设计!这都能行 鸟…

人工智能应用-实验7-胶囊网络分类minst手写数据集

文章目录 🧡🧡实验内容🧡🧡🧡🧡代码🧡🧡🧡🧡分析结果🧡🧡🧡🧡实验总结🧡🧡 &#x1f9…

微信小程序的自定义组件

一、创建自定义组件 (1)定义: 把页面重复的代码部分封装成为一个自定义组件,以便在不同的页面中重复使用,有助于代码的维护。 (2)组成: 自定义组件的组成:json文件&a…

Flutter 中如何优雅地使用弹框

日常开发中,Flutter 弹框(Dialog)是我们使用频率非常高的控件。无论是提示用户信息、确认用户操作,还是表单填写,弹框都能派上用场。然而,看似简单的弹框,实际使用起来却有不少坑和使用的技巧。…

el-select可选择可搜索可输入新内容

需求:el-form-item添加el-select,并且el-select可选择可搜索可输入新内容,并且和其他的el-input做联动,如果是选择,那么el-input自动回填数据并且不可编辑,如果el-select输入新的内容,那么el-in…

webpack5 splitChunks分割代码

首先明确webpack 自身的打包行为 当splitChunks为false时,此时不启用任何打包设置 可以看到,静态引入全都打到一个chunk里,动态引入会拆分出来一个chunk,这是纯webpack无配置的打包, webpack会给每个模块打上标记 ,如下 { m…

【HCIP学习】RSTP和MSTP

一、RSTP(Rapid Spanning Tree Protocol,快速生成树) 1、背景:RSTP从STP发展而来,具备STP的所有功能,可以兼容stp运行 2、RSTP与STP不同点 (1)减少端口状态 STP:disabled\blockin…

抵御风险——漫谈运维核心价值和方法论

要明晰什么是运维的核心价值,也就是要弄明白,从整个软件行业运维的角色定位来看,运维的核心价值在哪里?怎样增强自己实现核心价值的能力的问题。 软件产业本质其实还是工业,它的产品和传统的工业产品形态虽然有巨大差…

汇舟问卷:海外问卷调查如何闭坑?

大家好,我是汇舟问卷。有很多人问我这行有什么骗局吗?怎么说呢?其实每个行业都是真实存在的,也都有赚到钱的和赚不到钱的,那区别在哪里呢? 在你的源头,也就是教你或者说是代理加盟的上家&#…

机器学习实验 --- 逻辑回归

第1关:逻辑回归核心思想 任务描述 本关任务:根据本节课所学知识完成本关所设置的编程题 #encoding=utf8 import numpy as npdef sigmoid(t):完成sigmoid函数计算:param t: 负无穷到正无穷的实数:return: 转换后的概率值:可以考虑使用np.exp()函数#********** Begin *******…

景源畅信数字:抖音小店新手该怎么做?

在数字化时代的浪潮中,抖音不仅仅是一个分享短视频的平台,更是一个充满潜力的电商平台。对于想要进入这个领域的朋友们来说,开设一家抖音小店无疑是一个既激动又迷茫的起点。那么,作为新手,该如何在这个全新的舞台上立…

笔记 | 《css权威指南》

网络安全色 URL text-indent line-height & vertical-align 字体 font-weight 400 normal 700 bold background-attachment

iOS系统故障怎么办?这三种苹果手机系统修复方法你一定要知道

随着苹果手机使用时间越长,苹果手机有时也会出现系统问题,如卡顿、崩溃、无法启动等。这些问题不仅影响用户的使用体验,还可能导致数据丢失。因此,掌握苹果手机系统修复方法显得尤为重要。本文将详细介绍苹果手机系统修复的常见方…

MyBatis入门(1)

目录 一、JDBC操作回顾 二、什么是MyBatis? 三、MyBatis入门 1、准备工作 (1)创建工程 (2)数据准备 2、配置数据库连接字符串 3、写持久层代码 4、单元测试 (1)使用IDEA自动成成测试类…

UFS协议—新手快速入门(一)【1-4】

本篇旨在为初学者提供关于通用闪存存储(UFS)的快速入门指南。 目录 一、背景介绍 二、UFS 三、半双工和全双工 (1)半双工(Half-Duplex) (2)全双工(Full-Duplex&…

【大模型】fineturn Q-wen

github上下载qwen1_5源码 修改finetun.sh 然后在路径qwen1_5/examples/sft下修改finetun.sh, 内容如下 #!/bin/bash export CUDA_DEVICE_MAX_CONNECTIONS1 DIRpwd# Guide: # This script supports distributed training on multi-gpu workers (as well as single-worker trai…

【HTML】制作一个跟随鼠标的流畅线条引导页界面(可直接复制源码)

目录 前言 HTML部分 CSS部分 JS部分 效果图 总结 前言 无需多言,本文将详细介绍一段HTML代码,图中线条可跟随鼠标移动,具体内容如下: 开始 首先新建一个HTML的文本,文本名改为[index.html],创建好后右…

弱电工程企业项目一体化管理系统解决方案!企智汇项目管理系统

企智汇工程项目管理系统是一款为弱电工程企业量身打造的专业解决方案,旨在帮助企业实现项目管理的数智化、全流程化和一体化。以下是该系统的详细介绍: 1. 功能丰富:企智汇工程项目管理系统支持全周期的项目管理,包括客户管理、招…

火山引擎边缘云亮相 Force 原动力大会,探索 AI 应用新范式

5月15日,2024 春季火山引擎 FORCE 原动力大会在北京正式举办。大会聚焦 AI 主题,以大模型应用为核心、以 AI 落地为导向,展示了火山引擎在大模型、云计算领域的实践应用,携手汽车、手机终端、金融、消费、互联网等领域的专家和企业…