【发布时间】:2020-02-03 17:21:05
【问题描述】:
试图让自己熟悉子例程和整体 Go,我正在尝试编写一个脚本,该脚本基本上将使用 sync.WaitGroup 启动我的 django 应用程序的所有服务并保持它们运行,直到我手动终止 Go 脚本,这就是为什么我没有 intitialize() 函数实际上告诉等待组进程已完成。收到可怕的fatal error: all goroutines are asleep - deadlock! 消息。
func main() {
var wg sync.WaitGroup
os.Chdir("/home/Projects/djangoapp")
cc := []cmds{cmds{
name: "django",
cmdsl: []string{"/home/Projects/djangoapp/env/bin/python", "manage.py", "runserver"},
},
cmds{
name: "celeryd",
cmdsl: []string{"/home/Projects/djangoapp/env/bin/celery", "-A", "djangoapp", "worker", "-l", "INFO", "-S", "django"},
},
}
for x := 0; x < 2; x++ {
wg.Add(1)
fmt.Println("starting up", cc[x].name)
go initialize(cc[x])
}
wg.Wait()
}
func initialize(ccmds cmds) {
cmd := exec.Command(ccmds.cmdsl[0], ccmds.cmdsl[1:]...)
cmd.Env = append(os.Environ(), "DJANGO_SETTINGS_MODULE=articleadmin.settings.default")
fmt.Println("initializing", ccmds.name)
cmd.Start()
fmt.Println("started", ccmds.name)
cmd.Wait()
}
它启动服务,但随后出现死锁错误。我做错了什么?
【问题讨论】:
-
这可能是因为你从来没有打电话给
wg.Done。您应该将WaitGroup作为指针 (&wg) 传递给您的初始化函数,然后在完成后调用wg.Done()
标签: go subroutine