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

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 MB​PASSok      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

案例 并发目录大小统计 业务逻辑 统计目录的文件数量和大小&#xff08;或其他信息&#xff09;。示例输出&#xff1a; // 某个目录&#xff1a;2637 files 1149.87 MB 实现思路 给定一个或多个目录&#xff0c;并发的统计每个目录的size&#xff0c;最后累加到一起。 当…...

pikachu之跨站脚本攻击(x‘s‘s)

1get型 输入a看一下 接着输入<a> 发现<>没有被过滤当做标签处理了 尝试在表单提交的框里面&#xff0c;输入xss语句 尝试输入<script>alert(1)</script> 发现有长度限制 因为这里是get请求 get请求的特点是&#xff1a;传参是在url中的 所以我们可以在…...

Qt模型/视图架构——委托(delegate)

一、为什么需要委托 模型&#xff08;model&#xff09;用来数据存储&#xff0c;视图&#xff08;view&#xff09;用来展示数据。因此&#xff0c;模型/视图架构是一种将数据存储和界面展示分离的编程方法。具体如下图所示&#xff1a; 由图可知&#xff0c;模型向视图提供数…...

python3.11SSL: SSLV3_ALERT_HANDSHAKE_FAILURE

参考&#xff1a;python request包 版本不兼容 报错sslv3 alert handshake failure 解决方法-CSDN博客 修改&#xff1a;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构建的目标检测系统&#xff0c;不仅极大地增强了实时目标识别的能力&#xff0c;还通过其直观的用户界面实现了对图片、视频乃至摄像头输入的无缝支持。该系统利用YOLOv10的高效检测算法&#xff0c;能够快速准确地识别图像中的多个对象&#xff0c;并标注…...

开源模型应用落地-FastAPI-助力模型交互-进阶篇(三)

一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理&#xff0c;使应用程序能够处理各种不同的请求场景&#xff0c;提高应用程序的灵活性和可扩展性。 在数据验证和转换方面&#xff0c;高级用法提供了更精细和准确的控制&#…...

机器人及其相关工科专业课程体系

机器人及其相关工科专业课程体系 前言传统工科专业机械工程自动化/控制工程计算机科学与技术 新兴工科专业智能制造人工智能机器人工程 总结Reference: 前言 机器人工程专业是一个多领域交叉的前沿学科&#xff0c;涉及自然科学、工程技术、社会科学、人文科学等相关学科的理论…...

C#数字医学影像系统(RIS/PACS)源码,Oracle数据库,C/S架构,运行稳定

数字医学影像系统&#xff08;RIS/PACS&#xff09;源码&#xff0c;三甲以下的医院都能满足。PACS 系统全套成品源码。 开发技术&#xff1a;C/S架构&#xff0c;C#开发语言&#xff0c;数据库服务器采用Oracle数据库。 医学影像存储与传输系统&#xff0c;融合了医学信息化…...

Spring-Boot基础--yaml

目录 Spring-Boot配置文件 注意&#xff1a; YAML简介 YAML基础语法 YAML:数据格式 YAML文件读取配置内容 逐个注入 批量注入 ConfigurationProperties 和value的区别 Spring-Boot配置文件 Spring-Boot中不用编写.xml文件&#xff0c;但是spring-Boot中还是存在.prope…...

C/C++蓝屏整人代码

文章目录 &#x1f4d2;程序效果 &#x1f4d2;具体步骤 1.隐藏任务栏 2.调整cmd窗口大小 3.调整cmd窗口屏幕颜色 4.完整代码 &#x1f4d2;代码详解 &#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&a…...

【Android安全】Ubuntu 下载、编译 、刷入Android-8.1.0_r1

0. 环境准备 Ubuntu 16.04 LTS&#xff08;预留至少95GB磁盘空间&#xff0c;实测占94.2GB&#xff09; Pixel 2 XL 要买欧版的&#xff0c;不要美版的。 欧版能解锁BootLoader、能刷机。 美版IMEI里一般带“v”或者"version"&#xff0c;这样不能解锁BootLoader、…...

HBuilder X3.4版本中使用uni-app自定义组件

HBuilder X3.4版本中使用uni-app自定义组件 这是我的小程序页面结构 方式一&#xff1a;导入components 1.创建componets文件&#xff0c;并编写你的组件页面 <template><view class"my-search-container"><!-- 使用 view 组件模拟 input 输入框的样…...

PHP基础语法(一)

一、初步语法 1、PHP代码标记&#xff1a;以 <?php 开始&#xff0c;以 ?> 结束&#xff1b; 2、PHP注释&#xff1a;行注释&#xff1a;//&#xff08;双斜杠&#xff09;或# 块注释&#xff1a;/* */ 3、PHP语句分隔符&#xff1a; 1&#xff09;在PHP中&#…...

Python项目打包与依赖管理指南

在Python开发中&#xff0c;python文件需要在安装有python解释器的计算机的电脑上才能运行&#xff0c;但是在工作时&#xff0c;我们需要给客户介绍演示项目功能时并不一定可以条件安装解释器&#xff0c;而且这样做非常不方便。这时候我们可以打包项目&#xff0c;用于给客户…...

矿产资源潜力预测不确定性评价

研究目的&#xff1a; 不确定性评估&#xff1a; 到底什么叫不确定性&#xff0c;简单来说就是某区域内的矿产资源量&#xff0c;并不确定到底有多少&#xff0c;你需要给出一个评估或者分布。 研究方法&#xff1a; 1.以模糊集来表示某些量&#xff1a; 关于什么是模糊集&am…...

食堂采购系统开发:从需求分析到上线实施的完整指南

本篇文章&#xff0c;笔者将详细介绍食堂采购系统从需求分析到上线实施的完整过程&#xff0c;旨在为开发团队和管理者提供一个系统化的指南。 一、需求分析 1.用户需求 常见的需求包括&#xff1a; -采购计划管理 -供应商管理 -库存管理 -成本控制 -报表生成 2.系统功…...

C++ 数据结构

C 数据结构 引言 数据结构是计算机科学中的一个核心概念&#xff0c;它涉及到如何在计算机中组织和存储数据&#xff0c;以便高效地进行数据访问和修改。C作为一种高效的编程语言&#xff0c;提供了丰富的内置数据类型和库&#xff0c;支持各种复杂的数据结构实现。本文将探讨…...

Elasticsearch:评估搜索相关性 - 第 1 部分

作者&#xff1a;来自 Elastic Thanos Papaoikonomou, Thomas Veasey 这是一系列博客文章中的第一篇&#xff0c;讨论如何在更好地理解 BEIR 基准的背景下考虑评估你自己的搜索系统。我们将介绍具体的技巧和技术&#xff0c;以便在更好地理解 BEIR 的背景下改进你的搜索评估流程…...

超声波清洗机哪款好用?保姆级教学,教你手把手挑选适合自己的超声波清洗机

提及超声波清洗机&#xff0c;大家都不陌生&#xff0c;尤其是佩戴眼镜的小伙伴&#xff0c;眼镜的镜片长时间不清洁容易模糊不清&#xff0c;而超声波清洗机的出现&#xff0c;可以轻松清洗还不会损坏镜片&#xff0c;备受眼镜党喜爱。但由于现在市面上的超声波清洗机的款式太…...

vscode常用组件

1.vue-helper 启用后点击右下角注册&#xff0c;可以通过vue组件点击到源码里面 2.【Auto Close Tag】和【Auto Rename Tag】 3.setting---Auto Reveal Exclude vscode跳转node_modules下文件&#xff0c;没有切换定位到左侧菜单目录> 打开VSCode的setting配置&#xff…...

MedGemma-X性能优化:基于CUDA的医疗影像加速处理

MedGemma-X性能优化&#xff1a;基于CUDA的医疗影像加速处理 1. 当医生等结果的时间&#xff0c;能不能再短一点&#xff1f; 上周陪家人做肺部CT复查&#xff0c;从扫描结束到拿到报告&#xff0c;中间隔了近40分钟。放射科医生说&#xff0c;现在AI辅助系统已经能帮着初筛&…...

AI不再是聊天机器人!从《Agentic Design Patterns》汲取的5大核心启示,彻底重塑你的架构思维

大多数开发者还以为&#xff0c;生成式AI的终极答案就是把大模型参数堆得更大、提示词写得更聪明&#xff0c;就能解决一切生产力难题。但最近读完Antonio Gulli的《Agentic Design Patterns》&#xff0c;我突然意识到&#xff1a;我们过去两年其实只造出了“引擎”&#xff0…...

OpenClaw设备控制:Qwen3-32B通过USB接口操作硬件实验

OpenClaw设备控制&#xff1a;Qwen3-32B通过USB接口操作硬件实验 1. 为什么选择OpenClaw做硬件控制&#xff1f; 去年夏天&#xff0c;我在工作室调试一个温控风扇项目时&#xff0c;发现传统嵌入式开发存在一个痛点&#xff1a;每次修改控制逻辑都需要重新烧录固件。当我偶然…...

Nitrox模组:如何将Subnautica的单人深海恐惧变为团队协作冒险

Nitrox模组&#xff1a;如何将Subnautica的单人深海恐惧变为团队协作冒险 【免费下载链接】Nitrox An open-source, multiplayer modification for the game Subnautica. 项目地址: https://gitcode.com/gh_mirrors/ni/Nitrox 当你第一次潜入4546B行星的海洋时&#xff…...

论文开题不再愁!书匠策AI来助你一臂之力

在学术的浩瀚海洋中&#xff0c;每一位扬帆起航的学子都渴望找到那座指引方向的灯塔&#xff0c;尤其是在撰写论文开题报告这一关键时刻。开题报告&#xff0c;作为论文的起点&#xff0c;不仅承载着研究的方向与目的&#xff0c;更是展现研究者学术素养与创新能力的重要窗口。…...

Java 新纪元 — JDK 25 + Spring Boot 4 全栈实战(十九):微服务实战——Boot 4 + Spring Cloud 2026.x,构建高并发电商分布式系统

系列导航 | ← 上一篇:D18 云原生部署:Docker + K8s + GraalVM | 下一篇:D20 Spring Security 7.x + JDK 25加密升级 → 适用读者:正在做微服务架构设计或升级的中高级开发者,有一定Spring Cloud经验。 前置知识:了解Spring Boot基础、Docker/K8s基础(D17-D18)、分布式…...

前端八股文面经大全: 蓝色光标前端一面OC(2026-03-23)·面经深度解析

前言 大家好&#xff0c;我是木斯佳。 相信很多人都感受到了&#xff0c;在AI浪潮的席卷之下&#xff0c;前端领域的门槛在变高&#xff0c;纯粹的“增删改查”岗位正在肉眼可见地减少。曾经热闹非凡的面经分享&#xff0c;如今也沉寂了许多。但我们都知道&#xff0c;市场的…...

如何利用gs-quant构建专业量化金融分析系统

如何利用gs-quant构建专业量化金融分析系统 【免费下载链接】gs-quant 用于量化金融的Python工具包。 项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant 在现代金融市场中&#xff0c;量化分析已成为投资决策的核心驱动力。随着市场复杂度提升&#xff0c;金…...

音乐格式转换全攻略:QMCDecode破解QQ音乐加密文件处理难题

音乐格式转换全攻略&#xff1a;QMCDecode破解QQ音乐加密文件处理难题 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默…...

HunyuanVideo-Foley参数详解:--guidance_scale对音效清晰度影响实测

HunyuanVideo-Foley参数详解&#xff1a;--guidance_scale对音效清晰度影响实测 1. 引言 在音视频内容创作领域&#xff0c;AI音效生成技术正逐渐成为专业制作人的得力助手。HunyuanVideo-Foley作为一款集视频生成与专业级音效合成于一体的先进工具&#xff0c;其参数调优直接…...