面试题答案
一键面试1. 取消信号传递
- 特性:
context
允许父协程向子协程传递取消信号。通过context.WithCancel
等函数创建的context
,当父协程调用取消函数时,所有基于该context
创建的子协程都会收到取消信号,从而优雅地停止执行。 - HTTP服务器应用场景:在HTTP服务器中,当客户端断开连接时,服务器需要及时取消相关的处理协程。例如,一个处理复杂业务逻辑的HTTP请求,可能启动了多个子协程进行数据查询、计算等操作。使用
context
,当客户端断开连接(可以通过http.Request.Context
获取context
并取消),所有相关子协程能收到取消信号,避免资源浪费和不必要的计算,使得代码逻辑更加清晰,维护起来更方便,因为不需要手动逐个管理每个子协程的停止。
2. 超时控制
- 特性:
context.WithTimeout
函数可以设置一个操作的最长执行时间。当超过这个时间,context
会自动取消,所有基于该context
的子协程都会收到取消信号。 - HTTP服务器应用场景:在处理HTTP请求时,设置合理的超时时间是很重要的。比如,一个请求可能需要从数据库获取数据,但数据库响应过慢。通过设置
context
的超时,当达到超时时间,相关的数据库查询协程以及其他依赖该查询结果的协程都会被取消,防止请求长时间阻塞,提高服务器的响应性能和整体稳定性。代码中只需在合适的地方传递这个带有超时的context
,就可以统一管理所有相关操作的超时逻辑,增强了代码的可维护性。
3. 值传递
- 特性:
context.WithValue
允许在context
中携带一些键值对数据,这些数据可以在不同的协程之间传递。 - HTTP服务器应用场景:在HTTP服务器处理请求过程中,可能需要在不同的协程之间传递一些上下文信息,如用户认证信息、请求ID等。通过将这些信息放入
context
中,可以方便地在整个请求处理流程中的各个协程间传递,而不需要通过函数参数层层传递。这使得代码结构更加简洁,维护时也更容易理解数据的流向和作用范围。