Go中异步任务处理核心是goroutine并发+channel通信;goroutine轻量高效,适合HTTP请求等耗时操作,启动用go func(){}(),传参避免闭包变量引用问题。
在 Go 中实现异步任务处理,核心是利用 goroutine 并发执行任务,再用 channel 安全传递结果或控制流程。它轻量、高效,无需引入复杂框架就能构建可靠的后台任务系统。
每个 goroutine 是一个轻量级线程,适合运行耗时操作(如 HTTP 请求、文件读写、数据库查询)。直接用 go func() {}() 启动即可:
注意:若函数需访问外部变量,建议显式传参,避免闭包引用问题。
for i := 0; i
for i := 0; i
启动多个 goroutine 后,常用无缓冲或带缓冲 channel 接收返回值,并配合 sync.WaitGroup 或 close +
range 确保所有任务结束:
results := make(chan string, 10)(缓冲大小按预期并发数设)results
for res := range results 持续读取,直到 channel 关闭close(results)
结合 select 和 time.After 或 context.Context,可优雅处理超时或主动取消:
select { case res :=
context.WithCancel 或 context.WithTimeout,将 ctx.Done() 作为 select 分支监听取消信号ctx.Err() != nil 并提前退出,避免资源泄漏把常见模式封装成函数,提升复用性。例如一个通用的“并发执行 N 个任务并收集结果”工具:
[]func() interface{})、最大并发数(限制 goroutine 数量)不复杂但容易忽略细节,关键是理清谁发、谁收、谁关、谁等。