go 并发

ops/2024/11/14 6:15:56/

一、问题

1.1描述

我想要检测一组url的运行状态,如果ok则返回true,结果返回的结果是空的

func CheckWebsites(wc WebsiteChecker, urls []string) map[string]bool {results := make(map[string]bool)for _, url := range urls {go func() {results[url] = wc(url)}()}return results
}

1.2 分析

因为CheckWebsites函数启动了多个 goroutine,但没有等待它们完成。在 Go 中,goroutines 是并发执行的,但它们的完成时间是不确定的。如果主函数在所有 goroutines 完成之前返回结果,那么结果会不完整或不准确。

1.3 改进

使用sync.WaitGroup来确保主函数等待所有 goroutines 完成。sync.WaitGroup提供了一种机制,用于等待一组操作完成。

import ("sync"
)func CheckWebsites(wc WebsiteChecker, urls []string) map[string]bool {results := make(map[string]bool)var wg sync.WaitGroup//创建一个sync.WaitGroup实例:mu := sync.Mutex{} // 保护 results 共享资源for _, url := range urls {wg.Add(1)go func() {defer wg.Done()//调用Done方法减少计数器result := wc(url)results[url] = result}()}wg.Wait()//在主goroutine中,调用Wait方法阻塞,直到计数器变为0:return results
}

二、新问题

问题一:在上面的代码中,共用一个url(类似于变成了全局变量),可能会出现:主线程运行结束,线程A-线程N还没有执行,那么url变量就变成了urls的最后一个数据。那么线程A-线程N所访问的全是url都相同。导致results的结果只有最后一个url才有效。
解决方法:把url传递到并发线程中

问题二:多线程下,并发访问了results;
解决方法:通过加锁解决。

func CheckWebsites(wc WebsiteChecker, urls []string) map[string]bool {results := make(map[string]bool)var wg sync.WaitGroupmu := sync.Mutex{} // 保护 results 共享资源for _, url := range urls {wg.Add(1)go func(url string) {defer wg.Done()result := wc(url)mu.Lock()//通过上锁,避免并发访问mapresults[url] = resultmu.Unlock()}(url)//把url当前的值传入并发线程中,而不是共用一个全局url}wg.Wait()return results
}

http://www.ppmy.cn/ops/85891.html

相关文章

MongoDB教程(二十一):MongoDB大文件存储GridFS

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、GridFS…

外卖霸王餐系统架构怎么选?

在当今日益繁荣的外卖市场中,外卖霸王餐作为一种独特的营销策略,受到了众多商家的青睐。然而,要想成功实施外卖霸王餐活动,一个安全、稳定且高效的架构选择至关重要。本文将深入探讨外卖霸王餐架构的选择,以期为商家提…

优化冗余代码:提升前端项目开发效率的实用方法

目录 前言代码复用与组件化模块化开发与代码分割工具辅助与自动化结束语 前言 在前端开发中,我们常常会遇到代码冗余的问题,这不仅增加了代码量,还影响了项目的可维护性和开发效率。还有就是有时候会接到紧急业务需求,要求立马完…

泄露的基准测试表明Meta Llama 3.1 405B模型的性能可能超过OpenAI GPT-4o

2024 年 4 月,Meta 推出了新一代最先进的开源大型语言模型Llama 3。前两个模型 Llama 3 8B 和 Llama 3 70B为同类规模的 LLM 树立了新的基准。然而,在短短三个月内,其他几个 LLM 的性能已经超过了它们。 Meta 已经透露,其最大的 L…

Python3网络爬虫开发实战(2)爬虫基础库

文章目录 一、urllib1. urlparse 实现 URL 的识别和分段2. urlunparse 用于构造 URL3. urljoin 用于两个链接的拼接4. urlencode 将 params 字典序列化为 params 字符串5. parse_qs 和 parse_qsl 用于将 params 字符串反序列化为 params 字典或列表6. quote 和 unquote 对 URL的…

PyTorch 的各个核心模块和它们的功能

1. torch 核心功能 张量操作:PyTorch 的张量是一个多维数组,类似于 NumPy 的 ndarray,但支持 GPU 加速。数学运算:提供了各种数学运算,包括线性代数操作、随机数生成等。自动微分:torch.autograd 模块用于…

iOS实际开发中使用数据驱动页面布局

引言 在实际的APP开发中,我们通常会首先根据设计团队提供的视觉设计UI来构建我们的应用页面。这些设计通常是最全面和理想化的状态,因为设计师并不需要考虑用户的实际操作和交互。然而,如果我们仅仅根据这些设计进行硬编码,会在应…

数据结构与算法-随机快速排序

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、随机化…