Win11 21H2系统下使用Golang 1.17执行go test -v多次后进程卡死问题

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

image

5 回复

原因:没有此任务的实例在运行 错误:无法中止 PID 33888(属于 PID 33836 子进程)的进程 找不到进程 33836

错误信息大概是这些,谢谢。

更多关于Win11 21H2系统下使用Golang 1.17执行go test -v多次后进程卡死问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我不懂中文,但据我理解,您无法终止 go.exe 进程。您能否复制 tskill 命令的输出并粘贴到您的帖子中?也许我可以复制文本并将其粘贴到 Google 翻译中,以便理解错误信息。

起初,我的Go版本是1.16,后来升级到了1.17。这个问题就出现了。经过一段时间的观察,原因并非go test,而是VSCode调用了gofmtgopls等工具。目前,我将GOPATH路径下的所有文件清空,重新获取后就不再出现了。

这个问题通常是由于 Go 测试进程未能正确清理导致的。在 Windows 系统上,特别是 Win11 21H2 配合 Go 1.17 时,可能会出现进程残留问题。以下是可能的原因和解决方案:

可能原因:

  1. 测试中的并发操作未正确关闭
  2. 文件锁或资源未释放
  3. 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

临时解决方案:

如果问题持续出现,可以尝试:

  1. 升级到 Go 1.18+ 版本,该问题在后续版本中有改善
  2. 使用 go test -parallel=1 限制并行测试
  3. 在测试命令后添加延迟:go test -v && timeout /t 5

这个问题在 Go 1.17 的 Windows 版本中确实存在,特别是在长时间运行测试套件时。确保所有测试都正确实现了资源清理是解决的根本方法。

回到顶部