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

go并发请求url

sync.WaitGroup写法
package mainimport ("database/sql""fmt""net/http""sync""time"_ "github.com/go-sql-driver/mysql"
)func main() {//开始计时start := time.Now()//链接数据库,用户名:密码@tcp(地址:端口)/数据库名dsn := "gin:gin@tcp(42.1.25.18:3306)/gin"// 连接到MySQL数据库db, err := sql.Open("mysql", dsn)if err != nil {fmt.Println("数据库连接错误: ", err)return}defer db.Close()urls := []string{"https://www.baidu.com","https://www.taobao.com","https://www.tmall.com","https://www.jd.com","https://www.sina.com.cn","https://www.sohu.com","https://www.qq.com","https://www.163.com","https://www.zhihu.com","https://www.weibo.com","https://www.bilibili.com","https://www.youku.com","https://www.iqiyi.com","https://www.alipay.com","https://www.dingtalk.com","https://www.wechat.com","https://www.360.cn","https://www.58.com","https://www.liepin.com","https://www.zhaopin.com","https://www.douban.com","https://www.ifeng.com","https://www.ctrip.com","https://www.qunar.com","https://www.meituan.com","https://www.dianping.com","https://www.ele.me","https://www.vip.com","https://www.suning.com","https://www.mi.com","https://www.huawei.com","https://www.vivo.com.cn","https://www.oppo.com","https://www.le.com","https://www.ganji.com","https://www.kuaidi100.com","https://www.17173.com","https://www.4399.com","https://www.tgbus.com","https://www.10010.com","https://www.10086.cn","https://www.189.cn","https://www.21cn.com","https://www.chinadaily.com.cn","https://www.xinhuanet.com","https://www.people.com.cn","https://www.thepaper.cn","https://www.guokr.com","https://www.ftchinese.com","https://www.cbnweek.com","https://www.163.com","https://www.sina.com.cn","https://www.sohu.com","https://www.qq.com","https://e.baidu.com","https://hezuo.baidu.com","https://yiyan.baidu.com",}//设置3s超时,避免请求时间过长client := http.Client{Timeout: 3 * time.Second,}//定义chan结构体,url,statustype Web struct {url    stringstatus string}//并发请求,定义一个WaitGroup,用于等待所有请求完成var wg sync.WaitGroupfor _, url := range urls {//增加一个等待wg.Add(1)//启动一个goroutinego func(url string) {//协程结束时调用Done通知main函数工作已经完成defer wg.Done()//请求resp, err := client.Get(url)if err != nil {fmt.Println("请求失败", err)_, err := db.Exec("INSERT INTO web (url, status) VALUES (?, ?)", url, "请求失败")if err != nil {return}} else {// 写入数据库_, err1 := db.Exec("INSERT INTO web (url, status) VALUES (?, ?)", url, resp.StatusCode)if err1 != nil {fmt.Println("写入数据库错误:", err1)return}}}(url)}//等待所有请求完成wg.Wait()//输出耗时elapsed := time.Since(start)fmt.Println("耗时:", elapsed)
}

sync.WaitGroup+channel

package mainimport ("database/sql""fmt""net/http""strconv""sync""time"_ "github.com/go-sql-driver/mysql"
)func main() {//开始计时start := time.Now()//链接数据库,用户名:密码@tcp(地址:端口)/数据库名dsn := "gin:gin@tcp(4.19.21.17:3306)/gin"// 连接到MySQL数据库db, err := sql.Open("mysql", dsn)if err != nil {fmt.Println("数据库连接错误: ", err)return}//关闭数据库defer db.Close()urls := []string{"https://www.baidu.com","https://www.taobao.com","https://www.tmall.com","https://www.jd.com","https://www.sina.com.cn","https://www.sohu.com","https://www.qq.com","https://www.163.com","https://www.zhihu.com","https://www.weibo.com","https://www.bilibili.com","https://www.youku.com","https://www.iqiyi.com","https://www.alipay.com","https://www.dingtalk.com","https://www.wechat.com","https://www.360.cn","https://www.58.com","https://www.liepin.com","https://www.zhaopin.com","https://www.douban.com","https://www.ifeng.com","https://www.ctrip.com","https://www.qunar.com","https://www.meituan.com","https://www.dianping.com","https://www.ele.me","https://www.vip.com","https://www.suning.com","https://www.mi.com","https://www.huawei.com","https://www.vivo.com.cn","https://www.oppo.com","https://www.le.com","https://www.ganji.com","https://www.kuaidi100.com","https://www.17173.com","https://www.4399.com","https://www.tgbus.com","https://www.10010.com","https://www.10086.cn","https://www.189.cn","https://www.21cn.com","https://www.chinadaily.com.cn","https://www.xinhuanet.com","https://www.people.com.cn","https://www.thepaper.cn","https://www.guokr.com","https://www.ftchinese.com","https://www.cbnweek.com","https://www.163.com","https://www.sina.com.cn","https://www.sohu.com","https://www.qq.com","https://e.baidu.com","https://hezuo.baidu.com","https://yiyan.baidu.com",}//设置3s超时,避免请求时间过长client := http.Client{Timeout: 3 * time.Second,}//定义chan结构体,url,statustype Web struct {url    stringstatus string}//并发请求var wg sync.WaitGroup//创建一个并发请求的channel,缓冲区大小为urls的长度results := make(chan *Web, len(urls))//遍历urls,k为索引,url为值for k, url := range urls {//增加一个等待wg.Add(1)fmt.Println("开始请求:", k, url)//启动一个goroutine,传入k和urlgo func(k int, url string) {//协程结束时调用Done通知main函数工作已经完成defer wg.Done()//请求resp, err := client.Get(url)if err != nil {fmt.Println("请求失败", err)//设置状态为请求失败results <- &Web{url: url, status: "请求失败"}return}//关闭请求defer resp.Body.Close()fmt.Println("请求完成:", k, url)//写入channelresults <- &Web{url: url, status: strconv.Itoa(resp.StatusCode)}}(k, url)}//统计有多少个请求完成了fmt.Println("等待所有请求完成")//等待所有请求完成wg.Wait()//关闭channelclose(results)//统计results的长度//fmt.Println("results长度:", len(results))fmt.Println("开始写入数据库")//遍历channelfor resp := range results {// 写入数据库_, err := db.Exec("INSERT INTO web (url, status) VALUES (?, ?)", resp.url, resp.status)if err != nil {fmt.Println("写入数据库错误:", err)}}fmt.Println("写入数据库完成")//输出耗时elapsed := time.Since(start)fmt.Println("耗时:", elapsed)
}

相关文章:

go并发请求url

sync.WaitGroup写法 package mainimport ("database/sql""fmt""net/http""sync""time"_ "github.com/go-sql-driver/mysql" )func main() {//开始计时start : time.Now()//链接数据库&#xff0c;用户名&#xf…...

刷题之Leetcode704题(超级详细)

704. 二分查找 力扣题目链接(opens new window)https://leetcode.cn/problems/binary-search/ 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&am…...

leetcode热题100.前k个高频元素

作者&#xff1a;晓宜 &#x1f308;&#x1f308;&#x1f308; 个人简介&#xff1a;互联网大厂Java准入职&#xff0c;阿里云专家博主&#xff0c;csdn后端优质创作者&#xff0c;算法爱好者 ❤️❤️❤️ 你的关注是我前进的动力&#x1f60a; Problem: 347. 前 K 个高频元…...

LangChain Demo | Agent X ReAct X wikipedia 询问《三体》的主要内容

背景 LangChain学习中&#xff0c;尝试改了一下哈里森和吴恩达课程当中的问题&#xff0c;看看gpt-3.5-turbo在集成了ReAct和wikipedia后&#xff0c;如何回答《三体》的主要内容是什么这个问题&#xff0c;当然&#xff0c;主要是为了回答这问题时LangChain内部发生了什么。所…...

Revit 2025新功能一览~

Hello大家好&#xff01;我是九哥~ Revit2025已经更新&#xff0c;安装后&#xff0c;简单试了下&#xff0c;还是挺不错的&#xff0c;流畅度啊&#xff0c;新功能啊&#xff0c;看来还是有听取用户意见的&#xff0c;接下来就简单看看都有哪些新功能。 好了&#xff0c;今天的…...

Head First Design Patterns -代理模式

什么是代理模式 代理模式为另一个对象提供替身或者占位符&#xff0c;以便控制客户对对象的访问&#xff0c;管理访问的方式有很多种。例如远程代理、虚拟代理、保护代理等。 远程代理&#xff1a;管理客户和远程对象之间的交互。 虚拟代理&#xff1a;控制访问实例化开销大的对…...

第十三题:天干地支

题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个&#xff0c;分别为&#xff1a;甲&#xff08;jiǎ&#xff09;、乙&#xff08;yǐ&#xff09;、丙&#xff08;bǐng&#xff09;、丁&#xff08;dīng&#xff09;、戊&#xff08;w&#xff09;、己&a…...

8000预算可以购买阿里云服务器配置整理

一个月8000元预算如何选择阿里云服务器配置&#xff1f;八千预算可选的阿里云服务器配置相当高了&#xff0c;这个预算可以购买阿里云企业级独享型云服务器&#xff0c;至少8核以上的配置&#xff0c;这个预算可以支持复杂、高负载或大规模的业务需求。阿里云服务器网整理8000元…...

游戏APP如何提高广告变现收益的同时,保证用户留存率?

APP广告变现对接第三方聚合广告平台主要通过SDK文档对接&#xff0c;一些媒体APP不具备专业运营广告变现的对接能力和资源沉淀&#xff0c;导致APP被封控&#xff0c;设置列入黑名单&#xff0c;借助第三方聚合广告平台进行商业化变现是最佳选择。#APP广告变现# 接入第三方平台…...

Linux ulimit命令教程:如何查看和设置系统资源限制(附实例详解和注意事项)

Linux ulimit命令介绍 ulimit是一个内置的Linux shell命令&#xff0c;它允许查看或限制单个用户可以消耗的系统资源量。在有多个用户和系统性能问题的环境中&#xff0c;限制资源使用是非常有价值的。 Linux ulimit命令适用的Linux版本 ulimit命令在所有主流的Linux发行版中…...

(delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)

8.5.2 封闭类和Final方法 如前所述&#xff0c;Java 采用非常动态的方法&#xff0c;默认情况下采用延迟绑定&#xff08;或虚函数&#xff09;。因此&#xff0c;Java 语言引入了一些概念&#xff0c;如不能继承的类&#xff08;封闭类&#xff09;和不能在派生类中覆盖的方法…...

vue3从精通到入门12:vue3的生命周期和组件

生命周期&#xff1a; 生命周期钩子主要包括&#xff1a; beforeCreate&#xff1a;组件实例被创建之前调用。在这个阶段&#xff0c;组件的 props 和 data 还未被初始化。created&#xff1a;组件实例创建完成后调用。在这个阶段&#xff0c;组件的 props 和 data 已经被初始…...

力扣热题100_链表_21_合并两个有序链表

文章目录 题目链接解题思路解题代码 题目链接 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例…...

探索未来智慧酒店网项目接口架构

在数字化时代&#xff0c;智慧酒店已成为酒店业发展的重要趋势之一。智慧酒店网项目接口架构作为支撑智慧酒店运营的核心技术之一&#xff0c;其设计和优化对于提升用户体验、提高管理效率具有重要意义。本文将深入探讨智慧酒店网项目接口架构的设计理念和关键要素。 ### 智慧…...

os模块篇(十三)

文章目录 os.mknod(path, mode0o600, device0, *, dir_fdNone)os.major(device, /)os.minor(device, /)os.makedev(major, minor, /)os.pathconf(path, name)os.readlink(path, *, dir_fdNone)os.remove(path, *, dir_fdNone)os.removedirs(name)os.rename(src, dst, *, src_di…...

【JavaEE初阶系列】——文件操作 IO 之 文件系统操作

目录 &#x1f4dd;认识文件 &#x1f6a9;树型结构组织 和 目录 &#x1f388;绝对路径和相对路径 &#x1f6a9;文件类型 &#x1f4dd;文件系统操作 &#x1f388;File 概述 &#x1f388;File类的使用 1. 绝对路径 vs 相对路径 2. 路径分隔符 3. 静态成员变量 4…...

JAVA 学习·类与方法

不同于 C &#xff0c;Java 是一门面向对象的编程语言。C 也有面向对象的内容&#xff0c;但是 C 和 Java 在方法的具体实现上存在区别。 方法的定义 方法(method)是为执行一个复杂操作组合在一起的语句集合。一个类中可以声明多个方法。其语法是采用 BNF 范式&#xff08;Bac…...

4. python练习题4-水仙花数

4. python练习题4-水仙花数 【目录】 文章目录 4. python练习题4-水仙花数1. 目标任务2. 水仙花数的特点3. 如何判断一个数是否是水仙花数&#xff1f;4. 打印3位水仙花数5. 判断一个数是不是水仙花数6. 列表推导式6. 列表推导式判断一个数是不是水仙花数 【正文】 1. 目标任务…...

【Qt 学习笔记】Qt 开发环境的搭建 | Qt 安装教程

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt 开发环境的搭建 | Qt 安装教程 文章编号&#xff1a;Qt 学习笔记 /…...

ids工业相机与电控位移台同步控制及数据采集

通过VS2017和OpenCV,实现ids工业相机与电控位移台同步控制及数据采集 目录项目环境配置代码流程及思路项目架构项目开发运行效果开发关键ids相机配置位移台环境配置相机头文件相机参数设置保存图像函数设置电控位移台头文件电控位移台设置参数最后就是通过main函数进行调用和控…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...