在日常的 Go 语言后端开发中,context.Context 绝对是我们最熟悉的“老朋友”。无论是 HTTP 请求流转、数据库查询还是微服务之间的 RPC 调用,我们都会在函数的第一个参数挂上它。但正是这位“老朋友”,有时也会给我们带来不小的麻烦。

特别是在需要从主请求中衍生出异步后台任务(比如发送邮件、记录审计日志、异步落库)时,一旦主请求返回并结束,Context 就会被自动取消(Cancel)。那些还在默默运行的后台异步任务就会跟着“陪葬”。

很多同学在刚接触 Go 协程时,可能都写过类似下面的代码: