gpt4 book ai didi

go - 使用go例程初始化多个服务

转载 作者:行者123 更新时间:2023-12-01 22:38:28 24 4
gpt4 key购买 nike

尝试使自己熟悉子例程和Go整体,我正在尝试编写一个脚本,该脚本基本上将使用sync.WaitGroup启动django应用程序的所有服务,并保持它们运行,直到我手动杀死Go脚本为止,这就是为什么我要m没有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()
}

它启动服务,但随后出现死锁错误。我究竟做错了什么?

最佳答案

goroutine完成后,您似乎忘记了调用wg.Done:

 go initialize(&wg,cc[x])
...

func initialize(wg *sync.WaitGroup,ccmds cmds) {
defer wg.Done()
...
}

否则, wg.Wait将无限期等待。当所有goroutine终止时,main goroutine将是在该WaitGroup上等待的唯一goroutine,因此会死锁。

关于go - 使用go例程初始化多个服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60044163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com