【发布时间】:2016-08-20 17:59:41
【问题描述】:
在执行go test -race 时,我发现在命令启动cmd.Start() 之前调用了os.Process.Kill,我提出了可能的解决方案,一个使用channel:
package main
import "os/exec"
func main() {
cmd := exec.Command("sleep", "10")
started := make(chan struct{}, 1)
go func() {
<-started
cmd.Process.Kill()
}()
if err := cmd.Start(); err != nil {
panic(err)
}
started <- struct{}{}
cmd.Wait()
}
或使用lock:
package main
import (
"os/exec"
"sync"
)
func main() {
var lock sync.Mutex
cmd := exec.Command("sleep", "10")
lock.Lock()
if err := cmd.Start(); err != nil {
panic(err)
}
lock.Unlock()
go func() {
cmd.Process.Kill()
}()
cmd.Wait()
}
这两个选项都有效,但想知道什么是最惯用或更好的方法,而主要目标只是防止杀死尚未启动的进程。
【问题讨论】:
-
两者都不应该使用,因为这是串行代码,完全不需要 goroutine。
-
@JimB 同意,不好的例子,但 AJPennster 的回答给了我一个很好的提示