非零基础自学Golang 第13章 并发与通道 13.4 select 13.5 小结

news2025/1/19 17:22:32

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第13章 并发与通道
        • 13.4 select
          • 13.4.1 select作用
          • 13.4.2 超时
          • 13.4.3 死锁
        • 13.5 小结

第13章 并发与通道

13.4 select

Go语言中,通过关键字select可以监听channel上的数据流动

select的用法和switch非常相似,由select开始一个新的选择块,每个选择条件由case语句来描述。

13.4.1 select作用

与switch语句可以选择任何可使用相等比较的条件相比,select有较多的限制,其中最大的限制就是每个case语句里面必须是一个I/O操作,大致结构如下:

select {
case <-chan1:
 	// 如果chan1成功读到数据,则执行该case语句
case chan2 <- 1:
 	// 如果成功向chan2写入数据,则执行该case语句
default:
	 //如果上面的case都没有执行成功,则执行该default语句
}

在一个select语句中,Go语言会按顺序从头至尾评估每一个发送和接收语句,如果其中的任意一个语句可以继续执行(没有被阻塞),那么就从那些可以执行的语句中随机选择一条来使用。

如果没有任何一条语句可以执行(即所有通道都被阻塞),就会默认执行default语句,同时程序的执行会从select语句后的语句中恢复。如果没有default语句,则select语句将被阻塞,直到有一个channel可以进行下去。

[ 动手写 13.4.1]

package main

import (
   "fmt"
   "time"
)

func main() {

   ch := make(chan int)

   go func() {

      for i := 0; i < 3; i++ {
         ch <- i
      }
   }()

   for {
      select {
      case msg := <-ch:
         fmt.Println(msg)
      default:
         time.Sleep(time.Second)
      }
   }
}

运行结果

在这里插入图片描述

13.4.2 超时

有时候会出现goroutine阻塞的情况,为了避免程序长时间进入阻塞,我们可以使用select来实现阻塞超时机制,通过如下方法实现:

[动手写 13.4.2 ]

package main

import (
   "fmt"
   "time"
)

func main() {

   ch := make(chan int)

   done := make(chan bool)

   go func() {

      for {
         select {
         case val := <-ch:
            fmt.Println(val)
         case <-time.After(time.Second * 3):
            fmt.Println("已超时3秒")
            done <- true
         }
      }
   }()

   for i := 0; i < 10; i++ {
      ch <- i
   }

   <-done
   fmt.Println("程序终止")
}

运行结果:

在这里插入图片描述

13.4.3 死锁

在编写并发程序时可能会碰到死锁。

什么是死锁?就是所有的线程或进程都在等待资源的释放,举个例子:

[动手写 13.4.3]

package main

func main() {

   ch := make(chan int)
   <-ch // 阻塞main goroutine, 信道ch 被锁
}

在这里插入图片描述

动手写13.4.3中只有一个goroutine,我们向里面加数据或者存数据的话,都会锁死信道,并且阻塞当前goroutine,也就是所有的goroutine(其实只有main线程一个)都在等待信道的开放(没人拿走数据的话,信道是不会开放的),这就产生了死锁。

在非缓冲信道上如果发生了流入无流出,或者流出无流入,都会导致死锁。

同样地,使用select关键字,其中不加任何代码也会产生死锁。

[ 动手写 13.4.4 ]

package main

func main() {

   select {
   
   }
}

运行结果

在这里插入图片描述

13.5 小结

  • 了解并行和并发的区别。
  • 掌握goroutine的创建和使用。
  • 掌握channel的创建和使用,以及多个goroutine之间的通信。
  • 掌握如何使用runtime包对goroutine进行调度。
  • 掌握channel的缓冲机制。
  • 掌握Go关键字select的常见用法。

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

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

相关文章

Python中的基本数据类型

文章目录前言一、字符串类型字符串表示方法二、数字类型1. 整数2.浮点数3.复数三、布尔类型总结前言 我们一般在电脑中存储的数据有多种数据类型。比如下图这张员工工资表&#xff1a; 表中员工姓名可以用字符串类型存储&#xff08;比如"李世民"、“侯君集”&#…

Hadoop学习----HDFS

文件系统 文件系统&#xff1a;是一种存储和组织数据的方法&#xff0c;实现数据的存储、分级组织、访问和获取等操作&#xff0c;使得用户对文件访问和查找变得容易。文件系统使用树形目录的抽象逻辑概念代替了硬盘等物理设备使用数据块的概念&#xff0c;用户不必关心数据底…

实验三 进程的互斥与同步

文章目录一、 实验目的二、 实验原理三、实验内容四、我的代码内容和现象1、philosopher12、philosopher2这个程序不会发生死锁&#xff0c;因为五、课后习题&#xff1a;1.什么是死锁&#xff1f;产生死锁的原因和必要条件是什么&#xff1f;2.实验中给出的伪代码流程&#xf…

Problem Set 3

1Lagrange Duality Formulate the Lagrange dual problem of the following linear programming prob-lem min cT rs.t.Ax 二b where a ∈R is variable,c ∈ R"&#xff0c;A ∈Rkn, b ∈ Rk. 解&#xff1a;设拉格朗日函数为L(x,λ)cTxλT(Ax−b)\mathcal{L}(x,\lambda)…

第十七章 webpack5项目搭建Vue-Cli(开发模式)

step1–创建项目目录 创建一个目录用来搭建vue-cli的项目 mkdir vue-cli cd vue-clistep2–初始化项目 初始化项目&#xff0c;生成一个package.json文件 npm init -ystep3–编写vue-cli的开发模式配置 新建目录 / |-config | |--webpack.dev.js | |--webpack.prod.js我…

USB TO SPI(上海同旺电子)调试器调试25LC020A

所需设备&#xff1a; 1、USB TO SPI(上海同旺电子)&#xff1b; 2、25LC020A 2Kb 2.5V SPI Serial EEPROM; Microchip 25LC020A 是一款 2 Kb 串行 EEPROM&#xff0c;采用行业标准串行外设接口 (SPI) 兼容串行总线。 该器件被组织为一个 256 x 8 位块&#xff0c;并针对消…

Java安全--CC7

在学CC7的时候我有这么几个疑问 1.为什么要两个LazyMap 2.hashCode那一步怎么计算的 3.为什么要remove yy 4.为什么put两个 我们可以先看一下CC7的链子是怎么走的: 其实分析链子还是从命令执行走到readObject比较好理解&#xff0c;虽然比较麻烦&#xff0c;比较繁琐&#xff0…

机器人机械臂运动学——逆运动学解算

1.情景概述 假设最一般的情况&#xff0c;我们的机械臂有六个自由度&#xff0c;那么从初始状态想要变化到目标的状态&#xff0c;一般情况下我们至少需要进行六次的变换&#xff0c;而这六次变换的矩阵参数隐含在整体的变换矩阵中。 根据之前的知识&#xff0c;左上角的3*3代表…

m基于隐马尔科夫模型(HMM)的手机用户行为预测(MMUB)算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 隐马尔可夫模型&#xff08;Hidden Markov Model&#xff0c;HMM&#xff09;是一种统计模型&#xff0c;广泛应用在语音识别&#xff0c;词性自动标注&#xff0c;音字转换&#xff0c;概率文法…

R语言中的Nelson-Siegel模型在汇率预测的应用

这篇文章的目的是指导读者逐步使用R编程语言实现Nelson-Siegel模型的步骤。 最近我们被客户要求撰写关于Nelson-Siegel模型的研究报告&#xff0c;包括一些图形和统计输出。 您可能已经知道&#xff0c;估计利率期限结构是任何资产定价的关键&#xff0c;因此对投资者和政策制…

5G无线技术基础自学系列 | 基于Massive MIMO的场景化波束优化

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 前面内容提到&#xff0c; 5G中引入了M…

机器人机械臂运动学——运动学正向解算

本博客内容参考台湾大学_林沛群教授_机器人学的课程内容 1.相对运动关系的描述方法 假设有现在这样的一个情景&#xff0c;从左到右有三个转轴&#xff0c;转轴本身可以转动&#xff0c;也可以沿着轴线上下平动&#xff0c;那么我们如何描述其中的运动学关系及其位置关系呢&am…

Linux Red Hat 8.0 cat、cut、sed、tail命令

1.cat&#xff1a; 在终端设备上显示文件内容 常用选项&#xff1a; -n 显示行数&#xff08;空格有编号&#xff09; -b 显示行数&#xff08;空格没有编号&#xff09; 命令格式&#xff1a;cat 选项 文件 特殊用法tac&#xff1a;倒着显示内容 配合重定向使用 查看 test1…

DPDK 多进程

DPDK库里是支持多进程和多线程&#xff0c;本文主要总结多进程的相关的操作。 DPDK多进程使用的关键启动参数&#xff1a; --proc-type&#xff1a;指定一个dpdk进程是主进程还是副进程&#xff08;参数值就用上面的primary或是secondary&#xff0c;或者是auto&#xff09;-…

【Bio】基础生物学 - 五个重要官能团 five important functional group

文章目录1. 羟qiǎng基&#xff08;hydroxyl&#xff09;2. 羧suō基&#xff08;carboxyl&#xff09;3. 氨基&#xff08;amino&#xff09;4. 磷酸盐&#xff08;phosphate&#xff09;5. 巯基&#xff08;sulfhydryl&#xff09;1. 羟qiǎng基&#xff08;hydroxyl&#xf…

最新进展 | Android 自定义机器学习堆栈

作者 / Android 机器学习平台团队相较于服务器端机器学习 (ML)&#xff0c;设备端机器学习有其独特的优势&#xff0c;如支持离线使用、延迟更低、隐私性更高和推理成本更低&#xff0c;因此 Android 中设备端机器学习的使用迅速增长。在构建基于设备端 ML 的功能时&#xff0c…

Android基于perfetto分析native内存泄露

官方文档(可在Chome直接翻译) https://perfetto.dev/docs/data-sources/native-heap-profiler 示例 raw-trace 资源地址 https://download.csdn.net/download/CSqingchen/87321798 本文示例是windows&#xff0c;这里使用了python工具&#xff0c;在Linux和mac同样适用 首先安装…

胡凡 《算法笔记》 上机实战训练指南 3.1 简单模拟

胡凡 《算法笔记》 上机实战训练指南 3.1 持续更新中 , 菜鸡的刷题笔记… 大学到现在了还没咋好好刷过题&#xff0c;该push自己了… 文章目录胡凡 《算法笔记》 上机实战训练指南 3.13.1 简单模拟【PAT B1001】害死人不偿命的&#xff08;3n1&#xff09;猜想【PAT B1032】挖掘…

spring扩展之基于HandlerMapping实现接口灰度发布的demo

背景 面试经常被问到&#xff0c;你了解spring源码吗&#xff1f;有基于spring做过什么扩展吗&#xff1f;除了PropertyPlaceholderConfigurer处理占位符(被说烂了)还有其他的吗&#xff1f; 看了springmvc的源码&#xff0c;有了一个新的案例可讲(吹) 基于HandlerMapping实现…

运营活动没做好,是没有明确目标

有很多运营人在做项目的时候&#xff0c;其实没有一个明确的目标&#xff0c;不清楚自己究竟为什么要做这件事。 我们在做运营方案前&#xff0c;要分析用户的需求有哪些&#xff0c;如何达成目标&#xff0c;制定出一个计划&#xff1a; 1、要做什么——计划 我们需要掌握运…