Win11 21H2系统下使用Golang 1.17执行go test -v多次后进程卡死问题
Win11 21H2系统下使用Golang 1.17执行go test -v多次后进程卡死问题 并且出现很多 go.exe 进程且无法杀死

5 回复

我不懂中文,但据我理解,您无法终止 go.exe 进程。您能否复制 tskill 命令的输出并粘贴到您的帖子中?也许我可以复制文本并将其粘贴到 Google 翻译中,以便理解错误信息。
起初,我的Go版本是1.16,后来升级到了1.17。这个问题就出现了。经过一段时间的观察,原因并非go test,而是VSCode调用了gofmt、gopls等工具。目前,我将GOPATH路径下的所有文件清空,重新获取后就不再出现了。
这个问题通常是由于 Go 测试进程未能正确清理导致的。在 Windows 系统上,特别是 Win11 21H2 配合 Go 1.17 时,可能会出现进程残留问题。以下是可能的原因和解决方案:
可能原因:
- 测试中的并发操作未正确关闭
- 文件锁或资源未释放
- Windows 进程管理特性与 Go 运行时交互问题
解决方案示例:
1. 添加测试清理逻辑
func TestMain(m *testing.M) {
// 设置测试前清理
cleanup()
code := m.Run()
// 测试后强制清理
cleanup()
os.Exit(code)
}
func cleanup() {
// 清理可能残留的资源
// 例如:关闭数据库连接、停止HTTP服务器等
}
2. 使用 t.Cleanup() 确保资源释放
func TestExample(t *testing.T) {
// 创建需要清理的资源
srv := startTestServer(t)
// 注册清理函数
t.Cleanup(func() {
if err := srv.Shutdown(context.Background()); err != nil {
t.Logf("清理失败: %v", err)
}
})
// 测试逻辑
// ...
}
3. 控制并发数量
func TestConcurrent(t *testing.T) {
// 限制并发数量
maxConcurrent := runtime.NumCPU()
sem := make(chan struct{}, maxConcurrent)
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
wg.Add(1)
go func(idx int) {
defer wg.Done()
sem <- struct{}{}
defer func() { <-sem }()
// 测试逻辑
// ...
}(i)
}
wg.Wait()
}
4. 强制终止残留进程的 PowerShell 脚本
# kill_go_processes.ps1
Get-Process go* | Where-Object {$_.Path -like "*go.exe*"} | Stop-Process -Force
Get-Process test* | Where-Object {$_.Path -like "*test.exe*"} | Stop-Process -Force
5. 使用任务管理器批处理命令
@echo off
taskkill /F /IM go.exe
taskkill /F /IM test.exe
timeout /t 2
临时解决方案:
如果问题持续出现,可以尝试:
- 升级到 Go 1.18+ 版本,该问题在后续版本中有改善
- 使用
go test -parallel=1限制并行测试 - 在测试命令后添加延迟:
go test -v && timeout /t 5
这个问题在 Go 1.17 的 Windows 版本中确实存在,特别是在长时间运行测试套件时。确保所有测试都正确实现了资源清理是解决的根本方法。


