go 并发

一、问题

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.mzph.cn/diannao/50780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL 中如何重置序列值:将自增 ID 设定为特定值开始

我是从excel中将数据导入,然后再通过sql插入数据,就报错。 需要设置自增ID开始值 1、确定序列名称: 首先,需要找到与的增字段相关的序列名称。假设表名是 my_table 和自增字段是 id,可以使用以下查询来获取序列名称…

C 语言动态链表

线性结构->顺序存储->动态链表 一、理论部分 从起源中理解事物,就是从本质上理解事物。 -杜勒鲁奇 动态链表是通过结点(Node)的集合来非连续地存储数据,结点之间通过指针相互连接。 动态链表本身就是一种动态分配内存的…

mysql8.0.13限制用户对库表得增删改查权限

-- 如果用户存在删除用户 DROP USER test%; -- 创建test用户并赋密码 CREATE USER test% IDENTIFIED BY 123456; -- 给账号权限(查询、修改权限) grant select,update on test.user to test% -- 解决mysql8报错:ERROR 1410 (42000): You are not allowe…

读写RDS或RData等不同格式的文件,包括CSV和TXT、Excel的常见文件格式,和SPSS、SAS、Stata、Minitab等统计软件的数据文件

R语言是数据分析和科学计算的强大工具,其丰富的函数和包使得处理各种数据格式变得相对简单。在本文中,我们将详细介绍如何使用R语言的函数命令读取和写入不同格式的文件,包括RDS或RData格式文件、常见的文本文件(如CSV和TXT)、Excel文件,和和SPSS、SAS、Stata、Minitab等…

【深度学习】LLaMA-Factory 大模型微调工具, 大模型GLM-4-9B Chat ,微调与部署 (2)

文章目录 数据准备chat评估模型导出模型部署总结 资料: https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md https://www.53ai.com/news/qianyanjishu/2015.html 代码拉取: git clone https://github.com/hiyouga/LLaMA-Factory.git cd …

万物互联,触手可及“2024南京智慧城市,物联网,大数据展会”

在金秋送爽的11月,南京这座历史悠久而又充满活力的城市,即将迎来一场科技盛宴——2024南京智慧城市、物联网、大数据展会。这不仅是一场技术的集会,更是未来生活蓝图的预览,它汇聚了全球顶尖的科技企业、创新者及行业精英&#xf…

【C++】循环结构-while语句

while 语句的语法格式&#xff1a; while (循环条件) {在满足循环条件下执行的操作} 注意要留有跳出循环的方式&#xff0c;避免死循环 1、不写 whlie (1)&#xff0c;写具体的循环条件 2、写while(1)&#xff0c;用 break 跳出循环 下面是一个实例 #include<iostream…

邮件攻击案例系列三:动态 IP 池爆破员工邮箱钓鱼重要客户

案例描述 2023 年 11 月&#xff0c;某制造业企业员工 Emily 接到海外客户电话&#xff0c;向其核实一封电子邮件的真实性&#xff0c;因为客户认为&#xff0c;该邮件所给出的链接不像是该公司的官网网址。Emily 查看自己的邮箱&#xff0c;并未发现客户所说的邮件。但从客户…

Oracle(26) 什么是区(Extent)?

在Oracle数据库中&#xff0c;区&#xff08;Extent&#xff09;是用于分配和管理存储空间的一个逻辑单元。一个区由一组连续的数据块&#xff08;Data Blocks&#xff09;组成&#xff0c;数据库对象&#xff08;如表、索引等&#xff09;通过分配一个或多个区来存储其数据。区…

数据结构-----对列

前言 Hello, 小伙伴们&#xff0c;你们的作者菌又来了&#xff0c;前不久&#xff0c;我们学习了一种数据结构----栈&#xff0c;他特殊的性质使得他在一些数据管理的问题上被广泛的使用&#xff0c;那今天&#xff0c;我们就来学习另一种十分重要的数据结构--对列。 在开始之…

基于STM32设计的个人健康检测仪(华为云IOT)(191)

基于STM32设计的个人健康检测仪(华为云IOT)(191) 文章目录 一、设计需求1.1 设计需求总结1.2 设计思路【1】整体设计思路【2】整体构架【3】ESP8266模块配置【4】上位机开发思路【5】供电方式1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】课题研究的意义【…

Linux字符设备驱动基本框架

本章我们从 Linux 驱动开发中最基础的字符设备驱动开始&#xff0c;重点学习 Linux 下字符设备驱动开发框架。本章会以一个虚拟的设备为例&#xff0c;讲解如何进行字符设备驱动开发&#xff0c;以及如何编写测试 APP 来测试驱动工作是否正常&#xff0c;为以后的学习打下坚实的…

3. 系统上电启动流程

1. 概述 上电启动&#xff0c;可参考恒玄sdk的指导手册。 注&#xff1a;可以在sdk这里加载自己的入口函数 STEP1&#xff1a; STEP2&#xff1a; STEP3&#xff1a; STEP4&#xff1a;

【日常记录】【插件】多媒体文本化: text-image 可以将文字、图片、视频进行「文本化」

文章目录 1. html基本结构2. 画文字3. 画图片4. 画视频参考地址 1. html基本结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-s…

ctfshow web入门 中期测评 web492--web502

web492 <?php include(render/render_class.php); include(render/db_class.php);$action$_GET[action]; if(!isset($action)){header(location:index.php?actionlogin);die(); }if($actioncheck){extract($_GET);if(preg_match(/^[A-Za-z0-9]$/, $username)){$sql &qu…

如何设置postgresql数据库的账户密码

说明&#xff1a;在我的云服务器上&#xff0c;postgres是使用yum的方式安装的&#xff0c;不需要设置postgres账户的密码&#xff0c;本文介绍安装后如何手动设置postgres账户的密码&#xff1b; postgres数据库安装&#xff0c;参考下面这篇文章&#xff1a; PostgreSQL安装…

SpringBoot整合SSE技术详解

Hi &#x1f44b;, Im shy SpringBoot整合SSE技术详解 1. 引言 在现代Web应用中,实时通信变得越来越重要。Server-Sent Events (SSE)是一种允许服务器向客户端推送数据的技术,为实现实时更新提供了一种简单而有效的方法。本文将详细介绍如何在SpringBoot中整合SSE,并探讨S…

python-学生排序(赛氪OJ)

[题目描述] 已有 a、b 两个链表&#xff0c;每个链表中的结点包括学号、成绩。要求把两个链表合并&#xff0c;按学号升序排列。输入格式&#xff1a; 输入共 NM1 行。 第一行&#xff0c;输入 a、b 两个链表元素的数量 N、M&#xff0c;中间用空格隔开。下来 N 行&#xff0c;…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十章 Linux用户层和内核层

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

2-Python数据类型——序列

Python数据类型——序列 一、序列 序列是一个可以存放多个值的容器。 有序序列&#xff1a;在序列中每个值都有对应的下标 下标&#xff1a;就相当于酒店的房间号 &#xff0c; 方便客人的查找与酒店的管理 在编程中下标的起始值与日常生活中的计数有所不同&#xff1a;下…