Go context 对HTTP请求的影响

一、起因

Go语言中contex是控制协程行为的利器,既然是利器,那么用得好可以取得非常好的效果,用的不好,反手就可能伤了自己。为能使用好它,就需要了解其特性,以及在各种场景下的用法。最近遇到的一个问题,HTTP请求发给Server后,对应的context取消掉之后,请求被Server正常处理了,但客户端因为Context被取消,认为请求失败了。以此为契机研究下为什么会出现这种现象,即研究清楚,HTTP请求中的Context是被如何使用的。

二、HTTP标准库中的context

由于发送和接收本身是一个异常过程,猜测是在某个环节发送完数据后,等待Server端响应。

还是带着以下问题来看。

2.1 context如何包含在HTTP请求中的?

标准库中的http.Request类型,有WithContext的方法,这个方法为一个Request包含了一个Context实例。

2.2 HTTP请求中的Context是如何生效的?

在roundTrip中(net/http/transport.go),如下逻辑。

复制代码
for {
	select {
	case <-ctx.Done():
		req.closeBody()
		return nil, ctx.Err()
	default:
	}
	// 发起连接,执行HTTP请求。
}

正是在等待Server端响应,同时也在判断Request的Context是否取消了。

三、小结

当Request中的Context有设置时,这个Context会影响到HTTP的结果,如果你不期望Context取消时影响到具体的HTTP请求,那么就不应该设置这个参数。默认不设置时,Context的取消不会终止掉具体的HTTP请求。

具体来说,如果你是在一个协程中等待一个HTTP请求的完成,那么会有如下现象:

  1. 未设置Context时,默认情况,协程对应的Context取消时,对应的协程不会终止,直到请求完成。
  2. 设置Context时,协程的Context取消时,HTTP请求终止,协程退出。所以就可能出现,请求被Server正常处理,但Client看到了失败。
相关推荐
阿里嘎多学长2 小时前
2026-10-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
布吉岛的石头2 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
小羊没烦恼!3 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
紧跟先前的步伐3 小时前
Go AI Agent 实战 05|Temperature 与生成参数:让模型输出可控
java·人工智能·golang
quantdash_cc4 小时前
从实时行情到价格观察表:用 Python 和 Pandas 构建策略输入数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
昂好的day4 小时前
VisionMaster 通信模块实战(上):Modbus、TCP 收发、协议组装解析
开发语言·网络·网络协议·tcp/ip·c#
努力实干5 小时前
面向对象设计原则——C++
开发语言·c++·数码相机
NetX行者7 小时前
四语言 Hello World 背后:编译模型与运行时对比
开发语言
Pin_Qing8 小时前
账单没超,请求先被拒了
大数据·开发语言·人工智能
2601_962885728 小时前
如何用 Python 计算 VaR 和 CVaR(在险价值)?
开发语言·python