go - 使用 goroutine 初始化多个服务
问题描述
试图让自己熟悉子例程和整体 Go,我正在尝试编写一个脚本,该脚本基本上将启动我的 django 应用程序的所有服务sync.WaitGroup
并保持它们运行,直到我手动终止 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
在 goroutine 完成后忘记调用:
go initialize(&wg,cc[x])
...
func initialize(wg *sync.WaitGroup,ccmds cmds) {
defer wg.Done()
...
}
没有那个,wg.Wait
将无限期地等待。当所有的 goroutine 都终止时,主 goroutine 将是唯一等待该 WaitGroup 的 goroutine,因此死锁。
推荐阅读
- python-3.x - 如何提高数据加载性能python
- javascript - 解析错误;JavaScript中的意外令牌索引
- python-3.x - 在特定字符之间搜索最后一组文本
- bash - Git别名在克隆时自动为个人回购信息添加前缀?
- ios - 每次我在 Swift 中使用它时都必须启动一个 BLE 外围设备
- javascript - 来自 react-router-dom 的提示问题未触发
- mysql - 在存储过程中调用存储过程并将结果设置为变量时出现问题
- typescript - VSCode API:在终端中运行命令并使用输出
- python - 如何在 PyQt5 中为屏幕上的点移动设置动画
- javascript - 如何在 URL 中调用 echo 包括?