range遍历 channel 的小坑

2023-11-14



package main

import (
	"fmt"
	"sync"
)

var wg = sync.WaitGroup{}

func main() {
	c := make(chan int) //无缓冲
	wg.Add(1)
	go send(c)
	for i := range c { //send()协程写完不close的话,当send()执行结束后,主协程会阻塞,至进程崩溃
		fmt.Println(i)
	}
	//wg.Add(1)
	//go recv(c)
	wg.Wait()
}

//只能向chan里写数据
func send(c chan<- int) {
	defer wg.Done()
	for i := 0; i < 10; i++ {
		c <- i
	}
	//close(c)
}

//只能取channel中的数据
func recv(c <-chan int) {
	defer wg.Done()
	for i := range c {
		fmt.Println(i)
	}
	fmt.Println("out")
}

在这里插入图片描述
send()执行结束的话没有主动close, 主协程一直在读取c 中的数据,导致阻塞崩溃



package main

import (
	"fmt"
	"sync"
)

var wg = sync.WaitGroup{}

func main() {
	c := make(chan int) //无缓冲
	wg.Add(1)
	go send(c)
	//for i := range c { //send()协程写完不close的话,当send()执行结束后,主协程会阻塞,至进程崩溃
	//	fmt.Println(i)
	//}
	wg.Add(1)
	go recv(c)
	wg.Wait()
}

//只能向chan里写数据
func send(c chan<- int) {
	defer wg.Done()
	for i := 0; i < 10; i++ {
		c <- i
	}
	//close(c)
}

//只能取channel中的数据
func recv(c <-chan int) {
	defer wg.Done()
	for i := range c {
		fmt.Println(i)
	}
	fmt.Println("out")
}

同样会崩溃 ,recv()阻塞且没有释放条件 协程泄露,不执行wg.done(),导致主协程阻塞在wg.wait(),

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

range遍历 channel 的小坑 的相关文章

  • C++ 封装 类

    封装 可以达到 对外提供接口 屏蔽数据 对内开放数据 比如我们用struct封装的类 即知其接口 又可以直接访问其内部数据 这样却没有达到信息隐蔽的功效 而class则提供了这样的功能 屏蔽内部数据 对外开放接口 struct中所有行为和属

随机推荐

  • 渣硕2020暑期实习面经

    春招也基本结束了 拿了点offer 因为一开始就没有准备找区块链方向岗位 所以准备的还是研发岗 简历写了一些分布式 所以分布式理论问的也蛮多 感觉形势蛮严峻的 好多厂貌似都不开放暑期实习了 个人比较遗憾的就是微软笔试时候浏览器没搞好 导致没
  • 错误使用 network/subsasgn>network_subsasgn (line 550) net.IW{1,1} must be a 16-by-19 matrix. 出错 network

    该代码为基于PSO和BP网络的预测 清空环境 clc clear 读取数据 load CHE2 mat 节点个数 inputnum 17 hiddennum 16 outputnum 1 训练数据和预测数据 input train inpu
  • mysql 集群 一主两从环境测试,MHA主备切换

    目录 前言 1 相关安装文件 2 虚拟机 mysql数据库安装 2 1 安装VMware 15 以及 linux 操作系统 2 2 安装mysql数据库 2 2 1安装环境准备 2 2 2 mysql 数据库安装 2 3 克隆centos虚
  • Cmake零基础教程——常用语法命令

    编译选项 在cmake脚本中 设置编译选项有两种方式 1 可以通过add compile options命令 2 也可以通过set命令修改CMAKE CXX FLAGS或CMAKE C FLAGS 存在即合理 那么使用这两种方式存在怎样的区
  • ssh和ftp登录的几种方式

    ssh登录的几种方式 本文为https www bilibili com video av755468030 笔记 1 密码账号登录 ssh p 1234 name 目标ip p 为指定端口 name为用户名 2 使用公钥私钥登录 获取指定
  • IDEA中javaweb项目导入外部jar包

    IDEA中javaweb项目导入外部jar包 打开Project Structure 选中Modules 选择Dependencies 点击 选择要导入的jar包或jar包文件夹 选中要使用的jar包或jar包文件夹 点击ok 如果只是按照
  • excel导出功能

    安装excel所需依赖和按需加载 由于 Export2Excel不仅依赖js xlsx还依赖file saver和script loader 所以你先需要安装如下命令 npm install xlsx file saver S npm in
  • React传参和定义变量

    react 声明变量 react传参
  • 学习linux内核的经典书籍介绍

    有关内核的书籍可以用汗牛充栋来形容 不过只有一些经典的神作经住了考验 首先是5本久经考验的神作 个人概括为 2 1 2 第一个2是指2本全面讲解内核的书 中间的1指1本讲解驱动开发的书 后面的2则指2本有关内核具体子系统的书 你是否想到了某
  • vscode 静态语法检测插件C/C++ Advanced Lint,ubuntu20.04安装clang、cppcheck

    远程环境 ubuntu20 04 本地开发环境 windows 11 开发IDE vscode 一 ubuntu20 04安装clang 安装llvm apt get install llvm 2 安装clang apt get insta
  • 11-数据结构-双链表的创建-输出-初始化-插入-删除

    问题 双链表的创建 输出 初始化 插入 删除 思路 搞清楚双链表是怎么样的 多了一个前指针 此外每次链接的时候 都是先连接好后面的再连接前面的 直接看代码吧 代码如下 include
  • 思科实验 voip通信的配置(内附命令超详细)

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 目录 一 实验目的和要求 二 实验设备
  • Python疫情数据爬取与可视化

    使用Python爬取腾讯新闻疫情数据 并使用pyecharts可视化 绘制增长人数地图 柱状图 折线图 文章目录 1 分析网页 2 导入模块 3 抓取数据 4 提取数据并写入Excel 5 国内各地区现有确诊人数地图 6 国内各地区现有确诊
  • 秒懂边缘云

    作者 辰舒 章节内容 如何配置解析记录 已有CNAME A记录时如何配置 如何检查解析配置是否生效 解析基本原理 前言 上个章节中我们学习了如何根据业务情况添加CDN域名并配置源站 但在添加完成后 域名尚未真正接入CDN服务 我们需要将域名
  • Kafka

    1 概述 1 1 定义 Kafka是一个分布式的基于发布 订阅模式的消息队列 主要应用于大数据实时处理领域 优势 kafka可以做到 使用非常普通的硬件 也可以支持每秒数百万的消息读写 MQ 代表消息队列 kafka只是众多mq中一款产品
  • Shell脚本编程入门--Day2

    文章目录 几个简单内置shell命令 shell字串的语法 计算变量长度的各种玩法 批量修改文件名 特殊shell扩展变量 实际应用 父子shell 创建进程列表 创建子shell 几个简单内置shell命令 echo n 不换行输出 e
  • 牛客面试高频算法题js(最长无重复子数组、删除链表的倒数第n个节点、大数加法、按之字形顺序打印二叉树、链表相加(二))

    最长无重复子数组 描述 给定一个长度为n的数组arr 返回arr的最长无重复元素子数组的长度 无重复指的是所有数字都不相同 子数组是连续的 比如 1 3 5 7 9 的子数组有 1 3 3 5 7 等等 但是 1 3 7 不是子数组 数据范
  • Java并发基础:变量的线程安全

    一 变量的线程安全分析 成员变量和静态变量是否线程安全 如果它们没有共享 则线程安全 如果它们被共享了 根据它们的状态是否能够改变 又分两种情况 如果只有读操作 则线程安全 如果有读写操作 则这段代码是临界区 需要考虑线程安全 局部变量是否
  • 解决Windows Server 2012 R2无法远程桌面

    通常使用Windows Server 的远程桌面 我们自然是在配置中启用远程桌面 系统会默认将所需要的防火墙对应的入站协议启用 这样我们就可使用远程桌面了 但是如果您尝试了Windows Server 2012 R2后 或许会碰到和我一样的
  • range遍历 channel 的小坑

    package main import fmt sync var wg sync WaitGroup func main c make chan int 无缓冲 wg Add 1 go send c for i range c send 协