全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Golang如何实现并发HTTP请求_Golang HTTP请求并发处理方法

Go语言通过goroutine和channel实现高效并发HTTP请求,示例中使用多个goroutine并行执行fetch函数并通过channel接收结果;为避免资源耗尽,可引入sync.WaitGroup与协程池控制并发数;同时需设置超时机制,推荐使用context.WithTimeout进行请求级超时控制,确保程序健壮性。

在Go语言中,实现并发HTTP请求非常简单且高效,得益于其原生支持的goroutine和channel机制。通过合理使用这些特性,可以轻松地同时发起多个HTTP请求,提升程序性能,特别是在需要获取多个独立资源时。

使用Goroutine并发发起HTTP请求

每个HTTP请求可以在独立的goroutine中执行,从而实现并发。标准库net/http本身是线程安全的,可以直接在多个goroutine中调用。

示例代码:

package main

import ( "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返回。主函数等待所有结果返回后打印输出。

控制并发数量:使用WaitGroup与协程池思想

如果请求量很大,直接为每个请求启动goroutine可能导致系统资源耗尽。可以通过sync.WaitGroup配合固定数量的工作协程来控制并发数。

package main

import ( "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小时内与您取得联系。