当前位置: 首页 > news >正文

golang goroutine(协程)和 channel(管道) 案例解析

文章目录

    • goroutine和channel概念
    • 开启线程与channel简单通信流程
    • 多个工作协程并发执行流程

goroutine和channel概念

  • goroutine(协程),一般我们常见的是进程,线程,进程可以理解为一个软件在运行执行的过程,线程跟协程比较类似,都是单独开辟一块内存,异步执行。不同的是协程占的内存比较小初始栈2KB左右。
  • channel(管道) , 管道实则也是用来存储数据的,那为什么不用切片呢,channel主要用于多个协程之间的通信同步,遵循的是先进先出,channel有容量的限制,如果说一直往里面存,不取的话那管道就会阻塞报错,所以合理处理管道数据,当数据处理完成后,要将管道关闭,不然后面如果要遍历channel时,就会一直等待channel关闭才会执行完成。

开启线程与channel简单通信流程

这里是使用了sync.awitGroup实现多协程异步执行,与channel进行通信过程。


//使用awitGroup用于阻塞主进程作用 等待所有协程执行完成,解除阻塞(类似于计数器,计数器为0,解除阻塞)
var wg sync.awitGroupfunc printNum (ch chan int){for i :=1; i < 10 i++{//循环将i添加到ch管道中,(channel为引用类型,可以直接修改源数据)ch <- i}//关闭管道 在后面我们如果要遍历处理管道数据时,不关闭则接收方会无线阻塞close(ch)//计数器减1wg.Done()
}func readNum (ch chan int){//往ch管道中取数据 打印出来 ,channel时数据消耗性,只要读取了,这条数据不会在channel中保留、for v := range ch{fmt,printIn(v)}}func main {//创建一个channel管道,int类型,容量为10(缓冲区为10)ch:= make(chan int ,10)//计数器加1wg.add(1)//go关键字 开启一个协程 go printNum(ch)//计数器加1wg.add(1)//开启一个协程  协程与协程go readNum(ch)//阻塞主进程wg.awit()fmt.printIn("执行完成")
}

多个工作协程并发执行流程

处理100万个数字内那些是素数,这种数量大的情况下,循环创建多个工作协程,同时执行相关逻辑。

//使用awitGroup用于阻塞主进程作用 等待所有协程执行完成,解除阻塞(类似于计数器,计数器为0,解除阻塞)
var wg sync.awitGroupfunc generateNumbers(inputChan chan int){for i :=2; i < 1000000 i++{//循环将i添加到ch管道中,(channel为引用类型,可以直接修改源数据)inputChan  <- i}//关闭管道 在后面我们如果要遍历处理管道数据时,不关闭则接收方会无线阻塞close(ch)//计数器减1wg.Done()
}func worker(inputChan chan int , outputChan chan int,exitChan chan int){//inputChan 管道中取数据 打印出来 ,channel是数据消耗性,只要读取了,这条数据不会在channel中保留、所以循环worker线程是随机值,是不可能多个工作线程执行一个数值for num := range inputChan {flag := truefor i := 2; i < num; i++ {// 判断如果不为素数 flag为false 则break跳出循环if num%i == 0 {flag = falsebreak}}if flag {primeChan <- num //num 为素数 放在outputChan 管道中}}// 标记减一  与wg.add(1) 配套使用wg.Done()// 因为worker需要多次执行 所以不能直接关闭outputChan 管道// 向exitChan管道中写入数据 记录退出信号exitChan <- true}func listenWorker(exitChan chan int ,outputChan chan int){for i:=1; i < 16; i++{/*从oututChan中取数据,如果循环过程中执行的比工作协程快,没有取到数据,则会阻塞等待,直到outputChan中拿到数据,循环16次,全部协程执行完成。*/<-outputChan}//关闭outputChan管道close(outputChan)//结束监听携程wg.Done()
}func main {//存储100万个待处理数字inputChan:= make(chan int ,1000)//存素数的channel管道outputChan:= make(chan int 1000)//监听多协程结束的信号 容量为16,因为我们就开了16个协程,一般为cpu的逻辑处理器数量exitChan := make(chat bool 16)//计数器加1wg.add(1)//go关键字 开启一个协程 go generateNumbers(inputChan)// 创建工作协程numWorkers := runtime.NumCPU() // 协程数 = CPU 核心数for i := 0; i < numWorkers; i++ {go worker(inputChan, outputChan)}//如何关闭循环的多协程,第二种方案 再开一协程用于实时监听工作协程工作状态wg.add(1)go listenWorker(exitChan,outputChan)//阻塞主进程wg.awit()//如何关闭循环的多协程,第一种方案 在所有协程完成之后,关闭存素数的管道(outputChan)close(outputChan)fmt.printIn("执行完成")
}

相关文章:

golang goroutine(协程)和 channel(管道) 案例解析

文章目录 goroutine和channel概念开启线程与channel简单通信流程多个工作协程并发执行流程 goroutine和channel概念 goroutine(协程)&#xff0c;一般我们常见的是进程&#xff0c;线程&#xff0c;进程可以理解为一个软件在运行执行的过程&#xff0c;线程跟协程比较类似&…...

底层源码和具体测试解析HotSpot JVM的notify唤醒有序性(5000字详解)

在大家的认知里&#xff0c;或者大家也可能搜过&#xff0c;notify唤醒机制到底是随机的呢&#xff1f;还是顺序的呢&#xff1f;在网上其实也有很多人说notify的唤醒机制就是随机的&#xff0c;但实际上并不是这样的&#xff0c;notify的唤醒机制是先进先出的&#xff01; 目…...

Jenkins(CI/CD工具)

1. 什么是 Jenkins&#xff1f; Jenkins 是一个开源的持续集成&#xff08;CI&#xff09;和持续交付/部署&#xff08;CD&#xff09;工具&#xff0c;用于自动化软件构建、测试和部署过程。 2. Jenkins 优势 &#xff08;1&#xff09;开源免费&#xff1a;社区活跃&#…...

Apache Sqoop数据采集问题

Sqoop数据采集格式问题 一、Sqoop工作原理二、Sqoop命令格式三、Oracle数据采集格式问题四、Sqoop增量采集方案 Apache Sqoop是一款开源的工具&#xff0c;主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递&#xff0c;可以将一个关系型数据库&…...

再学GPIO(二)

GPIO寄存器 每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL&#xff0c;GPIOx_CRH)&#xff0c;两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR)&#xff0c;一个32位置位/复位寄存器(GPIOx_BSRR)&#xff0c;一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。 GPIO…...

err: Error: Request failed with status code 400

好的&#xff0c;今天学习ai的时候从前端发送请求&#xff0c;实在是想不通为啥会啥是一个坏请求&#xff0c;后来从前端方法一个一个找参数&#xff0c;传递的值都有&#xff0c;然后想到我这边需要传递的是一个对象&#xff0c;那么后端使用的RequestParam就接收不到json对象…...

解决qnn htp 后端不支持boolean 数据类型的方法。

一、背景 1.1 问题原因 Qnn 模型在使用fp16的模型转换不支持类型是boolean的cast 算子&#xff0c;因为 htp 后端支持量化数据类型或者fp16&#xff0c;不支持boolean 类型。 ${QNN_SDK_ROOT_27}/bin/x86_64-linux-clang/qnn-model-lib-generator -c ./bge_small_fp16.cpp -b …...

k8s学习记录(五):Pod亲和性详解

一、前言 上一篇文章初步探讨了 Kubernetes 的节点亲和性&#xff0c;了解到它在 Pod 调度上比传统方式更灵活高效。今天我们继续讨论亲和性同时Kubernetes 的调度机制。 二、Pod亲和性 上一篇文章中我们介绍了节点亲和性&#xff0c;今天我们讲解一下Pod亲和性。首先我们先看…...

MongoDB与PHP7的集成与优化

MongoDB与PHP7的集成与优化 引言 随着互联网技术的飞速发展,数据库技术在现代软件开发中扮演着越来越重要的角色。MongoDB作为一种流行的NoSQL数据库,以其灵活的数据模型和强大的扩展性受到众多开发者的青睐。PHP7作为当前最流行的服务器端脚本语言之一,其性能和稳定性也得…...

maven相关概念深入介绍

1. pom.xml文件 就像Make的MakeFile、Ant的build.xml一样&#xff0c;Maven项目的核心是pom.xml。POM&#xff08;Project Object Model&#xff0c;项目对象模型&#xff09;定义了项目的基本信息&#xff0c;用于描述项目如何构建&#xff0c;声明项目依赖&#xff0c;等等。…...

以科技之力,启智慧出行 —— 阅读《NVIDIA 自动驾驶安全报告》及观看实验室视频有感

作为中南民族大学通信工程专业的学生&#xff0c;近期研读《NVIDIA 自动驾驶安全报告》并观看其实验室系列视频后&#xff0c;我深刻感受到自动驾驶技术不仅是一场交通革命&#xff0c;更是一次社会生产力的解放与民族精神的升华。这场变革的浪潮中&#xff0c;我看到了科技如何…...

2P4M-ASEMI机器人功率器件专用2P4M

编辑&#xff1a;LL 2P4M-ASEMI机器人功率器件专用2P4M 型号&#xff1a;2P4M 品牌&#xff1a;ASEMI 封装&#xff1a;TO-126 批号&#xff1a;最新 引脚数量&#xff1a;3 封装尺寸&#xff1a;如图 特性&#xff1a;双向可控硅 工作结温&#xff1a;-40℃~150℃ 在…...

基础的贝叶斯神经网络(BNN)回归

下面是一个最基础的贝叶斯神经网络&#xff08;BNN&#xff09;回归示例&#xff0c;采用PyTorch实现&#xff0c;适合入门理解。 这个例子用BNN拟合 y x 噪声 的一维回归问题&#xff0c;输出均值和不确定性&#xff08;方差&#xff09;。 import torch import torch.nn a…...

小黑享受思考心流: 73. 矩阵置零

小黑代码 class Solution:def setZeroes(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead."""items []m len(matrix)n len(matrix[0])for i in range(m):for j in range(n):if not m…...

整合 | 大模型时代:微调技术在医疗智能问答矩阵的实战应用20250427

&#x1f50e; 整合 | 大模型时代&#xff1a;微调技术在医疗智能问答矩阵的实战应用 一、引言 在大模型技术高速变革的背景下&#xff0c;数据与微调技术不再是附属品&#xff0c;而是成为了AI能力深度重构的核心资产。 尤其在医疗行业中&#xff0c;微调技术改写了智能分诊和…...

Web安全:威胁解析与综合防护体系构建

Web安全&#xff1a;威胁解析与综合防护体系构建 Web安全是保护网站、应用程序及用户数据免受恶意攻击的核心领域。随着数字化转型加速&#xff0c;攻击手段日益复杂&#xff0c;防护需兼顾技术深度与系统性。以下从威胁分类、防护技术、最佳实践及未来趋势四个维度&#xff0…...

spring项目rabbitmq es项目启动命令

应该很多开发者遇到过需要启动中间件的情况&#xff0c;什么测试服务器挂了&#xff0c;服务连不上nacos了巴拉巴拉的&#xff0c;虽然是测试环境&#xff0c;但也会手忙脚乱&#xff0c;疯狂百度。 这里介绍一些实用方法 有各种不同的场景&#xff0c;一是重启&#xff0c;服…...

人工智能期末复习1

该笔记为2024.7出版的人工智能技术应用导论&#xff08;第二版&#xff09;课本部分的理论总结。 一、人工智能的产生与发展 概念&#xff1a;人工智能是通过计算机系统和模型模拟、延申和拓展人类智能的理论、方法、技术及应用系统的一门新的技术科学。 发展&#xff1a;19…...

深入理解指针(5)

字符指针变量 对下述代码进行调试 继续go,并且观察p2 弹出错误&#xff1a; 为什么报错呢&#xff1f; 因为常量字符串是不能被修改的&#xff0c;否则&#xff0c;编译器报错。 最后&#xff0c;打印一下&#xff1a; 《剑指offer》中收录了⼀道和字符串相关的笔试题&#…...

新魔百和CM311-5_CH/YST/ZG代工_GK6323V100C_2+8G蓝牙版_强刷卡刷固件包(可救砖)

新魔百和CM311-5_CH&#xff0f;YST&#xff0f;ZG代工_GK6323V100C_28G蓝牙版_强刷卡刷固件包&#xff08;可救砖&#xff09; 1、准备一个优盘卡刷强刷刷机&#xff0c;用一个usb2.0的8G以下U盘&#xff0c;fat32&#xff0c;2048块单分区格式化&#xff08;强刷对&#xff…...

磁盘清理git gc

#!/bin/bash find / -type d -name “.git” 2>/dev/null | while read -r git_dir; do repo_dir ( d i r n a m e " (dirname " (dirname"git_dir") echo “Optimizing r e p o d i r " c d " repo_dir" cd " repod​ir"cd&…...

django admin AttributeError: ‘UserResorce‘ object has no attribute ‘ID‘

在 Django 中遇到 AttributeError: ‘UserResource’ object has no attribute ‘ID’ 这类错误通常是因为你在代码中尝试访问一个不存在的属性。在你的例子中&#xff0c;错误提示表明 UserResource 类中没有名为 ID 的属性。这可能是由以下几个原因造成的&#xff1a; 拼写错…...

现代Python打包工具链

现代Python打包工具如Poetry、Flit和Hatch提供了更简单、更强大的方式来管理项目依赖和打包流程。下面我将通过具体示例详细介绍这三种工具。 1. Poetry - 全功能依赖管理工具 Poetry是最流行的现代Python项目管理工具之一&#xff0c;它集依赖管理、虚拟环境管理和打包发布于一…...

(done) 吴恩达版提示词工程 8. 聊天机器人 (聊天格式设计,上下文内容,点餐机器人)

视频&#xff1a;https://www.bilibili.com/video/BV1Z14y1Z7LJ/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 别人的笔记&#xff1a;https://zhuanlan.zhihu.com/p/626966526 8. 聊天机器人&#xff08;Chatbot&#xff09; …...

Maven概述

1.maven是什么&#xff1f; Maven 是一个基于项目对象模型&#xff08;Project Object Model&#xff0c;POM&#xff09;概念的项目构建工具&#xff0c;主要用于 Java 项目的构建、依赖管理和项目信息管理。&#xff08;跨平台的项目管理工具&#xff0c;用于构建和管理任何…...

SKLearn - Biclustering

文章目录 Biclustering &#xff08;双聚类&#xff09;谱二分聚类算法演示生成样本数据拟合 SpectralBiclustering绘制结果 Spectral Co-Clustering 算法演示使用光谱协同聚类算法进行文档的二分聚类 Biclustering &#xff08;双聚类&#xff09; 关于双聚类技术的示例。 谱…...

使用c++实现一个简易的量子计算,并向外提供服务

实现一个简易的量子计算模拟器并提供服务是一个相对复杂的过程&#xff0c;涉及到量子计算的基本概念、C编程以及网络服务的搭建。以下是一个简化的步骤指南&#xff0c;帮助你开始这个项目&#xff1a; 步骤 1: 理解量子计算基础 在开始编码之前&#xff0c;你需要对量子计算…...

京东攻防岗位春招面试题

围绕电商场景&#xff0c;以下是5道具有代表性的技术面试题及其解析&#xff0c;覆盖供应链、电商大促、红蓝对抗等场景。 《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?…...

Kafka批量消费部分处理成功时的手动提交方案

Kafka批量消费部分处理成功时的手动提交方案 当使用Kafka批量消费时&#xff0c;如果500条消息中只有部分处理成功&#xff0c;需要谨慎处理偏移量提交以避免消息丢失或重复消费。以下是几种处理方案示例&#xff1a; 方案1&#xff1a;记录成功消息并提交最后成功偏移量 Co…...

消息中间件

零、文章目录 消息中间件 1、中间件 &#xff08;1&#xff09;概述 中间件&#xff08;Middleware&#xff09;是位于操作系统、网络与数据库之上&#xff0c;应用软件之下的一层独立软件或服务程序&#xff0c;其核心作用是连接不同系统、屏蔽底层差异&#xff0c;并为应…...

vue3直接操作微信小程序云开发数据库,web网页对云数据库进行增删改查

我们开发好小程序以后&#xff0c;有时候需要编写一个管理后台网页对数据库进行管理&#xff0c;之前我们只能借助云开发自带的cms网页&#xff0c;但是cms网页设计的比较丑&#xff0c;工作量和代码量也不够&#xff0c;所以我们今天就来带大家实现用vue3编写管理后台直接管理…...

重塑编程体验边界:明基RD280U显示器深度体验

重塑编程体验边界&#xff1a;明基RD280U显示器深度体验 写在前面 本文将以明基RD280U为核心&#xff0c;通过技术解析、实战体验与创新案例&#xff0c;揭示专业显示器如何重构开发者的数字工作台。 前言&#xff1a;当像素成为生产力的催化剂 在GitHub的年度开发者调查中&…...

Linux命令-iostat

iostat 命令介绍 iostat 是一个用于监控 Linux 系统输入/输出设备加载情况的工具。它可以显示 CPU 的使用情况以及设备和分区的输入/输出统计信息&#xff0c;对于诊断系统性能瓶颈&#xff08;如磁盘或网络活动缓慢&#xff09;特别有用。 语法&#xff1a; iostat [options…...

Hyper-V安装Win10系统,报错“No operating system was loaded“

环境&#xff1a; Win10专业版 Hyper-V 问题描述&#xff1a; Hyper-V安装Win10系统&#xff0c;报错"No operating system was loaded" 已挂载ISO但仍无法启动的深度解决方案​​ &#x1f527;如果已确认ISO正确挂载且启动顺序已调整&#xff0c;但虚拟机仍提…...

Zabbix

zabbix官网: https://www.zabbix.com zabbix中文操作手册&#xff1a;https://www.zabbix.com/documentation/5.0/zh/manual/introduction/features 1、SERVER Zabbix server 是 Zabbix 软件的核心组件。Zabbix Agent 向Zabbix server报告可用性、系统完整性信息和统计信息。…...

NEPCON China 2025 | 具身智能时代来临,灵途科技助力人形机器人“感知升级”

4月22日至24日&#xff0c;生产设备暨微电子工业展&#xff08;NEPCON China 2025&#xff09;在上海如期开展。本届展会重磅推出“人形机器人拆解展区”&#xff0c;汇聚35家具身智能产业链领军企业&#xff0c;围绕机械结构、传感器布局、驱动系统与AI算法的落地应用&#xf…...

css响应式布局设置子元素高度和宽度一样

css响应式布局设置子元素高度和宽度一样 常常遇到响应式布局 其中父元素&#xff08;类名为.list&#xff09;包含多个子元素&#xff08;类名为.item&#xff09;&#xff0c;每个子元素中显示一张图片&#xff0c;并且这些图片能够根据子元素的宽度和高度进行自适应调整。 …...

【AI论文】RefVNLI:迈向可扩展的主题驱动文本到图像生成评估

摘要&#xff1a;主题驱动的文本到图像&#xff08;T2I&#xff09;生成旨在生成与给定文本描述一致的图像&#xff0c;同时保留参考主题图像的视觉特征。 尽管该领域具有广泛的下游适用性——从增强图像生成的个性化到视频渲染中一致的角色表示——但该领域的进展受到缺乏可靠…...

信创系统 sudoers 权限配置实战!从小白到高手

好文链接&#xff1a;实战&#xff01;银河麒麟 KYSEC 安全中心执行控制高级配置指南 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于信创终端操作系统中 sudoers 文件详解的实用文章&#xff01;在 Linux 系统中&#xff0c;sudo 是一项非常重要的权限控制机制…...

用户行为检测技术解析:从请求头到流量模式的对抗与防御

用户行为检测是反爬机制的核心环节&#xff0c;网站通过分析请求特征、交互轨迹和时间模式&#xff0c;识别异常流量并阻断爬虫。本文从基础特征检测与高级策略分析两个维度&#xff0c;深入解析用户行为检测的技术原理与对抗方案。 一、基础特征检测&#xff1a;请求头与交互…...

关于Android Studio的AndroidManifest.xml的详解

AndroidManifest.xml 是 Android 项目的核心配置文件&#xff0c;它定义了应用的基本信息、所需权限、组件、功能等。它为 Android 系统提供了关于应用如何运行的重要信息。每个 Android 应用程序必须包含这个文件&#xff0c;而且这个文件的配置直接影响到应用的行为和安装要求…...

​​全栈自动化:从零构建智能CI/CD流水线​

1. 基础架构&#xff1a;GitLab Kubernetes​​ ​​1.1 GitLab CI/CD核心配置​​ GitLab通过.gitlab-ci.yml定义流水线阶段。以下是一个基础模板&#xff1a; stages:- build- test- deploybuild_job:stage: buildscript:- echo "Compiling the code..."- make…...

xe-upload上传文件插件

1.xe-upload地址&#xff1a;文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 2.由于开发app要用到上传文件组件&#xff0c;uni.chooseFile在app上不兼容&#xff0c;所以找到了xe-upload&#xff0c;兼容性很强&a…...

PySpark中DataFrame应用升阶及UDF使用

目录 1. 加载数据2. 列常见操作2.1 添加新列2.2 重命名列2.3 删除指定列2.4 修改数据 3 空值处理3.1 丢弃空值3.2 空值填充 4 聚合操作4.1 分组聚合 5 用户自定义函数&#xff08;UDF&#xff09;5.1 传统UDF函数5.2 Pandas UDF&#xff08;向量化UDF&#xff09; 参考资料 imp…...

C++ ——引用

引用定义 引用是一个已存在的变量的别名。 用法 类型 & 别名 引用指向的变量名 关于别名的理解&#xff1a; 别名可以理解为绰号或者小名&#xff0c;比如美猴王、齐天大圣、斗战胜佛等&#xff0c;指的都是孙悟空。 这意味着&#xff1a; ①别名和别名指向的变量其实是同…...

OpenCV 图形API(65)图像结构分析和形状描述符------拟合二维点集的直线函数 fitLine2D()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 拟合一条直线到2D点集。 该函数通过最小化 ∑ i ρ ( r i ) \sum_i \rho(r_i) ∑i​ρ(ri​)来将一条直线拟合到2D点集&#xff0c;其中 ri 是第…...

k8s生成StarRocks集群模版

集群由1个fe3个be组成&#xff0c;满足以下要求&#xff1a; 1、由3个pod组成&#xff0c;每pod分配2c4g 2、第一个pod里有一个be与一个fe&#xff0c;同在一个容器里&#xff0c;fe配置jvm内存设置为1024mb&#xff0c;be的jvm内存设置为1024MB 3、第二第三个pod里分别有一…...

web基础+HTTP+HTML+apache

目录 一.web基础 1.1web是什么 1.2HTTP 1.2.1HTTP的定义 1.2.2 HTTP请求过程 1.2.3 HTTP报文 1 请求报文 2 响应报文 1.2.4 HTTP协议状态码 1.2.5 HTTP方法 1.2.6 HTTP协议版本 二.HTML CSS和JavaScript 2.1HTML 2.1.1HTML的概述 2.1.2 HTML中的部分基本标签&…...

C++修炼:list模拟实现

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…...

Lua 第12部分 日期和时间

Lua 语言的标准库提供了两个用于操作日期和时间的函数&#xff0c;这两个函数在 C 语言标准库中也存在&#xff0c;提供的是同样的功能。 虽然这两个函数看上去很简单&#xff0c;但依旧可以基于这些简单的功能完成很多复杂的工作。 Lua 语言针对日期和时间使用两种表示方式。 …...