Go-Sandbox 开发实录 (4):穿越铁窗 —— 那些关于 IO 和超时的坑
牢笼建好了,犯人也关进去了。最后的问题是:我们怎么知道他在里面干了什么? 对于 Code Interpreter 来说,用户的代码输出(Stdout/Stderr)必须实时、完整地传回给前端。而且,如果代码死循环了,我们得能把它杀掉。 这两个看似简单的需求,在实现时也让我们踩了不少坑。 坑一:IO 阻塞与 Goroutine 泄漏 最初,我们简单地用 cmd.StdoutPipe() 获取管道,然后在一个 Goroutine 里读。 // 错误示范 go func() { io.Copy(outputChan, stdoutPipe) }() 但在高并发场景下,我们发现 Goroutine 数量飙升。原来,如果 Python 进程异常退出或者被 kill 掉,有时候管道的 Read…