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()//链接数据库,用户名…...

刷题之Leetcode704题(超级详细)
704. 二分查找 力扣题目链接(opens new window)https://leetcode.cn/problems/binary-search/ 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标&am…...
leetcode热题100.前k个高频元素
作者:晓宜 🌈🌈🌈 个人简介:互联网大厂Java准入职,阿里云专家博主,csdn后端优质创作者,算法爱好者 ❤️❤️❤️ 你的关注是我前进的动力😊 Problem: 347. 前 K 个高频元…...

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

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

Head First Design Patterns -代理模式
什么是代理模式 代理模式为另一个对象提供替身或者占位符,以便控制客户对对象的访问,管理访问的方式有很多种。例如远程代理、虚拟代理、保护代理等。 远程代理:管理客户和远程对象之间的交互。 虚拟代理:控制访问实例化开销大的对…...
第十三题:天干地支
题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(w)、己&a…...

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

游戏APP如何提高广告变现收益的同时,保证用户留存率?
APP广告变现对接第三方聚合广告平台主要通过SDK文档对接,一些媒体APP不具备专业运营广告变现的对接能力和资源沉淀,导致APP被封控,设置列入黑名单,借助第三方聚合广告平台进行商业化变现是最佳选择。#APP广告变现# 接入第三方平台…...
Linux ulimit命令教程:如何查看和设置系统资源限制(附实例详解和注意事项)
Linux ulimit命令介绍 ulimit是一个内置的Linux shell命令,它允许查看或限制单个用户可以消耗的系统资源量。在有多个用户和系统性能问题的环境中,限制资源使用是非常有价值的。 Linux ulimit命令适用的Linux版本 ulimit命令在所有主流的Linux发行版中…...
(delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
8.5.2 封闭类和Final方法 如前所述,Java 采用非常动态的方法,默认情况下采用延迟绑定(或虚函数)。因此,Java 语言引入了一些概念,如不能继承的类(封闭类)和不能在派生类中覆盖的方法…...
vue3从精通到入门12:vue3的生命周期和组件
生命周期: 生命周期钩子主要包括: beforeCreate:组件实例被创建之前调用。在这个阶段,组件的 props 和 data 还未被初始化。created:组件实例创建完成后调用。在这个阶段,组件的 props 和 data 已经被初始…...

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

探索未来智慧酒店网项目接口架构
在数字化时代,智慧酒店已成为酒店业发展的重要趋势之一。智慧酒店网项目接口架构作为支撑智慧酒店运营的核心技术之一,其设计和优化对于提升用户体验、提高管理效率具有重要意义。本文将深入探讨智慧酒店网项目接口架构的设计理念和关键要素。 ### 智慧…...
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 之 文件系统操作
目录 📝认识文件 🚩树型结构组织 和 目录 🎈绝对路径和相对路径 🚩文件类型 📝文件系统操作 🎈File 概述 🎈File类的使用 1. 绝对路径 vs 相对路径 2. 路径分隔符 3. 静态成员变量 4…...
JAVA 学习·类与方法
不同于 C ,Java 是一门面向对象的编程语言。C 也有面向对象的内容,但是 C 和 Java 在方法的具体实现上存在区别。 方法的定义 方法(method)是为执行一个复杂操作组合在一起的语句集合。一个类中可以声明多个方法。其语法是采用 BNF 范式(Bac…...
4. python练习题4-水仙花数
4. python练习题4-水仙花数 【目录】 文章目录 4. python练习题4-水仙花数1. 目标任务2. 水仙花数的特点3. 如何判断一个数是否是水仙花数?4. 打印3位水仙花数5. 判断一个数是不是水仙花数6. 列表推导式6. 列表推导式判断一个数是不是水仙花数 【正文】 1. 目标任务…...

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

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

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...