Go语言通过goroutine和channel实现高效并发HTTP请求,示例中使用多个goroutine并行执行fetch函数并通过channel接收结果;为避免资源耗尽,可引入sync.WaitGroup与协程池控制并发数;同时需设置超时机制,推荐使用context.WithTimeout进行请求级超时控制,确保程序健壮性。
在Go语言中,实现并发HTTP请求非常简单且高效,得益于其原生支持的goroutine和channel机制。通过合理使用这些特性,可以轻松地同时发起多个HTTP请求,提升程序性能,特别是在需要获取多个独立资源时。
每个HTTP请求可以在独立的goroutine中执行,从而实现并发。标准库net/http本身是线程安全的,可以直接在多个goroutine中调用。
示例代码:
package mainimport ( "fmt" "io/ioutil" "net/http" )
func fetch(url string, ch chan<- string) { resp, err := http.Get(url) if err != nil { ch <- fmt.Sprintf("Error: %s", url) return } defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) ch <- fmt.Sprintf("URL: %s, Status: %d, Body size: %d", url, resp.StatusCode, len(body)) }
func main() { urls := []string{ "https://www./link/5f69e19efaba426d62faeab93c308f5c", "https://www./link/98a733901e53052474f2320d0a3a9473", "https://www./link/c2148796071914983ed6b6e9dbbff735", }
ch := make(chan string, len(urls)) // 缓冲channel避免阻塞 for _, url := range urls { go fetch(url, ch) } for range urls { fmt.Println(<-ch) }}
在这个例子中,每个fetch函数运行在一个独立的goroutine中,结果通过channel返回。主函数等待所有结果返回后打印输出。
如果请求量很大,直接为每个请求启动goroutine可能导致系统资源耗尽。可以通过sync.WaitGroup配合固定数量的工作协程来控制并发数。
package mainimport ( "fmt" "net/http" "sync" )
func worker(jobs <-chan string, results chan<- string, wg *sync.WaitGroup) { defer wg.Done() for url := range jobs { resp, err := http.Get(url) if err != nil { results <- fmt.Sprintf("Failed: %s", url) continue } results <- fmt.Sprintf("OK: %s, Status: %d", url, resp.StatusCode) resp.Body.Close() } }
func main() { urls := []string{ "https://www./link/4d2fe2e8601f7a8018594d98f28706f2", "https://www./link/98a733901e53052474f2320d0a3a9473", "https://www./link/7ac09a39f051ff62eefbafd363b1bbb3", "https://www./link/dc17d9b4862d86f8054735577c04462a", "https://www./link/0ad3140ed0cf59e84008db87c8c1106c", }
const numWorkers = 3 jobs := make(chan string, len(urls)) results := make(chan string, len(urls)) var wg sync.WaitGroup // 启动工作协程 for i := 0; i < numWorkers; i++ { wg.Add(1) go worker(jobs, results, &wg) } // 发送任务 for _, url := range urls { jobs <- url } close(jobs) // 等待完成并关闭结果通道 go func() { wg.Wait() close(results) }() // 收集结果 for result := range results { fmt.Println(result) }}
这种方式能有效限制同时运行的goroutine数量,避免过多网络连接带来的压力。
并发请求中必须设置超时,防止某个请求长时间阻塞整个流程。可以通过自定义http.Client来实现。

client := &http.Client{
Timeout: 5 * time.Second,
}
resp, err := client.Get(url)
也可以使用context实现更灵活的超时控制:
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel()req, _ := http.NewRequestWithContext(ctx, "GET", url, nil) resp, err := http.DefaultClient.Do(req)
结合context可以在请求级别控制超时、取消等行为,更适合复杂场景。
基本上就这些。Go的并发模型让HTTP请求处理变得简洁而强大,关键是合理控制资源、处理错误,并利用channel协调数据流动。不复杂但容易忽略细节。
# js
# json
# go
# golang
# go语言
# ai
# 并发请求
# 标准库
# 线程
相关文章:
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
独立制作一个网站多少钱,建立网站需要花多少钱?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
如何在云虚拟主机上快速搭建个人网站?
定制建站策划方案_专业建站与网站建设方案一站式指南
如何在橙子建站中快速调整背景颜色?
代购小票制作网站有哪些,购物小票的简要说明?
威客平台建站流程解析:高效搭建教程与设计优化方案
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
英语简历制作免费网站推荐,如何将简历翻译成英文?
网站代码制作软件有哪些,如何生成自己网站的代码?
如何高效配置IIS服务器搭建网站?
制作旅游网站html,怎样注册旅游网站?
在线制作视频的网站有哪些,电脑如何制作视频短片?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
如何登录建站主机?访问步骤全解析
建站之星24小时客服电话如何获取?
定制建站流程解析:需求评估与SEO优化功能开发指南
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
如何基于云服务器快速搭建网站及云盘系统?
宁波自助建站系统如何快速打造专业企业网站?
如何基于云服务器快速搭建个人网站?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
如何快速生成高效建站系统源代码?
如何获取开源自助建站系统免费下载链接?
简历在线制作网站免费版,如何创建个人简历?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
建站之星3.0如何解决常见操作问题?
建站之星微信建站一键生成小程序+多端营销系统
如何用VPS主机快速搭建个人网站?
如何配置IIS站点权限与局域网访问?
建站之星后台密码遗忘如何找回?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
已有域名如何快速搭建专属网站?
存储型VPS适合搭建中小型网站吗?
学校免费自助建站系统:智能生成+拖拽设计+多端适配
如何在IIS7上新建站点并设置安全权限?
红河网站制作公司,红河事业单位身份证如何上传?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
教学网站制作软件,学习*后期制作的网站有哪些?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
宝塔建站后网页无法访问如何解决?
如何在云主机上快速搭建网站?
宿州网站制作公司兴策,安徽省低保查询网站?
制作证书网站有哪些,全国城建培训中心证书查询官网?
如何在云指建站中生成FTP站点?
*请认真填写需求信息,我们会在24小时内与您取得联系。