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函数进行调用和控…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
