Go语言并发编程-案例_3
案例
并发目录大小统计
业务逻辑
统计目录的文件数量和大小(或其他信息)。示例输出:
// 某个目录:2637 files 1149.87 MB
实现思路
-
给定一个或多个目录,并发的统计每个目录的size,最后累加到一起。
-
当目录中存在子目录时,递归的统计。
-
每个目录的统计都由独立的Goroutine完成
-
累计总Size由独立的Goroutine完成
-
使用Channel传递获取的文件大小
-
使用WaitGroup调度
核心代码
// 读取目录内容// os.ReadDirfunc ReadDir(name string) ([]DirEntry, error)entries, err := os.ReadDir(dir)// 取得文件信息info, err := entry.Info()//判定是否为目录entry.IsDir()
编码实现
func WalkDir(dirs ...string) string {if len(dirs) == 0 {dirs = []string{"."}}filesizeCh := make(chan int64, 1)wg := &sync.WaitGroup{}for _, dir := range dirs {wg.Add(1)go walkDir(dir, filesizeCh, wg)}go func(wg *sync.WaitGroup) {wg.Wait()close(filesizeCh)}(wg)var fileNum, sizeTotal int64for filesize := range filesizeCh {fileNum++sizeTotal += filesize}return fmt.Sprintf("%d files %.2f MB\n", fileNum, float64(sizeTotal)/1e6)}func walkDir(dir string, fileSizes chan<- int64, wg *sync.WaitGroup) {defer wg.Done()for _, fileinfo := range fileInfos(dir) {if fileinfo.IsDir() {subDir := filepath.Join(dir, fileinfo.Name())wg.Add(1)go walkDir(subDir, fileSizes, wg)} else {fileSizes <- fileinfo.Size()}}}func fileInfos(dir string) []fs.FileInfo {entries, err := os.ReadDir(dir)if err != nil {fmt.Fprintf(os.Stderr, "walkdir: %v\n", err)return []fs.FileInfo{}}infos := make([]fs.FileInfo, 0, len(entries))for _, entry := range entries {info, err := entry.Info()if err != nil {continue}infos = append(infos, info)}return infos}
测试执行
> go test -run=WalkDir70 files 0.09 MBPASSok goConcurrency 0.321s
快速排序的并发编程实现
典型的单线程快速排序实现
func QuickSortSingle(arr []int) []int {// 确保arr中至少存在2个或以上元素if arr == nil || len(arr) < 2 {return arr}// 执行排序quickSortSingle(arr, 0, len(arr)-1)return arr}func quickSortSingle(arr []int, l, r int) {// 判定待排序范围是否合法if l < r {// 获取参考元素位置索引mid := partition(arr, l, r)// 递归排序左边quickSortSingle(arr, l, mid-1)// 递归排序右边quickSortSingle(arr, mid+1, r)}}// 大小分区,返回参考元素索引func partition(arr []int, l, r int) int {p := l - 1for i := l; i <= r; i++ {if arr[i] <= arr[r] {p++swap(arr, p, i)}}return p}// 交换arr中i和j元素func swap(arr []int, i, j int) {t := arr[i]arr[i] = arr[j]arr[j] = t}
并发编程实现思路
-
使用独立的Goroutine完成arr中某部分的排序
-
WaitGroup 完成等待阻塞同步
编码实现
// QuickSortConcurrency 快速排序调用函数func QuickSortConcurrency(arr []int) []int {// 一:校验arr是否满足排序需要,至少要有2个元素if arr == nil || len(arr) < 2 {return arr}// 四:同步的控制wg := &sync.WaitGroup{}// 二:执行排序// 初始排序整体[0, len(arr)-1]wg.Add(1)go quickSortConcurrency(arr, 0, len(arr)-1, wg)wg.Wait()// 三:返回结果return arr}// 实现递归快排的核心函数// 接收arr,和排序区间的索引位置[l, r]func quickSortConcurrency(arr []int, l, r int, wg *sync.WaitGroup) {// 一:-1wg的计数器defer wg.Done()// 二:判定是否需要排序, l < rif l < r {// 三:大小分区元素,并获取参考元素索引mid := partition(arr, l, r)// 四:并发对左部分排序wg.Add(1)go quickSortConcurrency(arr, l, mid-1, wg)// 五:并发的对右部分排序wg.Add(1)go quickSortConcurrency(arr, mid+1, r, wg)}}
partition 和 swap 部分不变。
测试执行
func TestQuickSortConcurrency(t *testing.T) {randArr := GenerateRandArr(1000)sortArr := QuickSortConcurrency(randArr)fmt.Println(sortArr)}// 生成大的随机数组func GenerateRandArr(l int) []int {// 生产大量的随机数arr := make([]int, l)rand.Seed(time.Now().UnixMilli())for i := 0; i < l; i++ {arr[i] = int(rand.Int31n(int32(l * 5)))}return arr}
> go test -run=QuickSortConcurrency
相关文章:
Go语言并发编程-案例_3
案例 并发目录大小统计 业务逻辑 统计目录的文件数量和大小(或其他信息)。示例输出: // 某个目录:2637 files 1149.87 MB 实现思路 给定一个或多个目录,并发的统计每个目录的size,最后累加到一起。 当…...
pikachu之跨站脚本攻击(x‘s‘s)
1get型 输入a看一下 接着输入<a> 发现<>没有被过滤当做标签处理了 尝试在表单提交的框里面,输入xss语句 尝试输入<script>alert(1)</script> 发现有长度限制 因为这里是get请求 get请求的特点是:传参是在url中的 所以我们可以在…...
Qt模型/视图架构——委托(delegate)
一、为什么需要委托 模型(model)用来数据存储,视图(view)用来展示数据。因此,模型/视图架构是一种将数据存储和界面展示分离的编程方法。具体如下图所示: 由图可知,模型向视图提供数…...
python3.11SSL: SSLV3_ALERT_HANDSHAKE_FAILURE
参考:python request包 版本不兼容 报错sslv3 alert handshake failure 解决方法-CSDN博客 修改:Python311\Lib\site-packages\urllib3\util\ssl_.py 新版本3.11里默认没有DEFAULT_CIPHERS 补回来: #__imported from 3.6.8 # A secure default. # So…...
[深度学习]基于yolov10+streamlit目标检测演示系统设计
YOLOv10结合Streamlit构建的目标检测系统,不仅极大地增强了实时目标识别的能力,还通过其直观的用户界面实现了对图片、视频乃至摄像头输入的无缝支持。该系统利用YOLOv10的高效检测算法,能够快速准确地识别图像中的多个对象,并标注…...
开源模型应用落地-FastAPI-助力模型交互-进阶篇(三)
一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理,使应用程序能够处理各种不同的请求场景,提高应用程序的灵活性和可扩展性。 在数据验证和转换方面,高级用法提供了更精细和准确的控制&#…...
机器人及其相关工科专业课程体系
机器人及其相关工科专业课程体系 前言传统工科专业机械工程自动化/控制工程计算机科学与技术 新兴工科专业智能制造人工智能机器人工程 总结Reference: 前言 机器人工程专业是一个多领域交叉的前沿学科,涉及自然科学、工程技术、社会科学、人文科学等相关学科的理论…...
C#数字医学影像系统(RIS/PACS)源码,Oracle数据库,C/S架构,运行稳定
数字医学影像系统(RIS/PACS)源码,三甲以下的医院都能满足。PACS 系统全套成品源码。 开发技术:C/S架构,C#开发语言,数据库服务器采用Oracle数据库。 医学影像存储与传输系统,融合了医学信息化…...
Spring-Boot基础--yaml
目录 Spring-Boot配置文件 注意: YAML简介 YAML基础语法 YAML:数据格式 YAML文件读取配置内容 逐个注入 批量注入 ConfigurationProperties 和value的区别 Spring-Boot配置文件 Spring-Boot中不用编写.xml文件,但是spring-Boot中还是存在.prope…...
C/C++蓝屏整人代码
文章目录 📒程序效果 📒具体步骤 1.隐藏任务栏 2.调整cmd窗口大小 3.调整cmd窗口屏幕颜色 4.完整代码 📒代码详解 🚀欢迎互三👉:程序猿方梓燚 💎💎 🚀关注博主&a…...
【Android安全】Ubuntu 下载、编译 、刷入Android-8.1.0_r1
0. 环境准备 Ubuntu 16.04 LTS(预留至少95GB磁盘空间,实测占94.2GB) Pixel 2 XL 要买欧版的,不要美版的。 欧版能解锁BootLoader、能刷机。 美版IMEI里一般带“v”或者"version",这样不能解锁BootLoader、…...
HBuilder X3.4版本中使用uni-app自定义组件
HBuilder X3.4版本中使用uni-app自定义组件 这是我的小程序页面结构 方式一:导入components 1.创建componets文件,并编写你的组件页面 <template><view class"my-search-container"><!-- 使用 view 组件模拟 input 输入框的样…...
PHP基础语法(一)
一、初步语法 1、PHP代码标记:以 <?php 开始,以 ?> 结束; 2、PHP注释:行注释://(双斜杠)或# 块注释:/* */ 3、PHP语句分隔符: 1)在PHP中&#…...
Python项目打包与依赖管理指南
在Python开发中,python文件需要在安装有python解释器的计算机的电脑上才能运行,但是在工作时,我们需要给客户介绍演示项目功能时并不一定可以条件安装解释器,而且这样做非常不方便。这时候我们可以打包项目,用于给客户…...
矿产资源潜力预测不确定性评价
研究目的: 不确定性评估: 到底什么叫不确定性,简单来说就是某区域内的矿产资源量,并不确定到底有多少,你需要给出一个评估或者分布。 研究方法: 1.以模糊集来表示某些量: 关于什么是模糊集&am…...
食堂采购系统开发:从需求分析到上线实施的完整指南
本篇文章,笔者将详细介绍食堂采购系统从需求分析到上线实施的完整过程,旨在为开发团队和管理者提供一个系统化的指南。 一、需求分析 1.用户需求 常见的需求包括: -采购计划管理 -供应商管理 -库存管理 -成本控制 -报表生成 2.系统功…...
C++ 数据结构
C 数据结构 引言 数据结构是计算机科学中的一个核心概念,它涉及到如何在计算机中组织和存储数据,以便高效地进行数据访问和修改。C作为一种高效的编程语言,提供了丰富的内置数据类型和库,支持各种复杂的数据结构实现。本文将探讨…...
Elasticsearch:评估搜索相关性 - 第 1 部分
作者:来自 Elastic Thanos Papaoikonomou, Thomas Veasey 这是一系列博客文章中的第一篇,讨论如何在更好地理解 BEIR 基准的背景下考虑评估你自己的搜索系统。我们将介绍具体的技巧和技术,以便在更好地理解 BEIR 的背景下改进你的搜索评估流程…...
超声波清洗机哪款好用?保姆级教学,教你手把手挑选适合自己的超声波清洗机
提及超声波清洗机,大家都不陌生,尤其是佩戴眼镜的小伙伴,眼镜的镜片长时间不清洁容易模糊不清,而超声波清洗机的出现,可以轻松清洗还不会损坏镜片,备受眼镜党喜爱。但由于现在市面上的超声波清洗机的款式太…...
vscode常用组件
1.vue-helper 启用后点击右下角注册,可以通过vue组件点击到源码里面 2.【Auto Close Tag】和【Auto Rename Tag】 3.setting---Auto Reveal Exclude vscode跳转node_modules下文件,没有切换定位到左侧菜单目录> 打开VSCode的setting配置ÿ…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
