go - goroutine 上下文取消恐慌
问题描述
我有一项服务,它user -> user job -> user contact
为用户工作和联系人创建并通过包装 go goroutine 来包装他们的任务,
// create the user first.....
// then
go func() {
clientJob.UserID = user.ID
_, err = s.userJobRepository.Create(ctx, *clientJob)
if err != nil {
panic(err)
}
clientContact.UserID = user.ID
_, err = s.userContactRepository.Create(ctx, clientContact)
if err != nil {
panic(err)
}
}()
我进入context canceledpanic
了那个goroutine,然后我的服务器停止了,但是如果我不使用goroutine,它很好并且在创建过程中没有错误,有人知道为什么会发生这种情况以及如何处理吗?
解决方案
每个 goroutine 都有自己的堆栈。如果堆栈没有恢复,程序将悲惨地退出。建议:不要使用panic来控制业务逻辑。
问题是:为什么?如果userJobRepository.Create
或userContactRepository.Create
失败,用户将永远不会知道它,并且您的服务器将死机。
推荐阅读
- sql - Oracle 简单更新脚本导致“ORA-00600:内部错误代码,参数:[15851]、[6]、[6]、[1]、[2]、[]、[]、[]”
- java - 如何使用 Java 将关系数据库转换为 owl
- r - R中对象的S3摘要方法
- java - 展开可展开复合材料时,首选项页面不会调整大小
- windows - 需要杀死从 Windows 中的任务列表中获得的多个 PID
- lua - 意外标记附近的语法错误(在 Lua
- javascript - 滚动功能处于活动状态时如何删除类
- python - 重新启动 Jupyter 笔记本时如何避免重新运行所有代码
- c++ - 将 .cpp 文件转换为 .wasm 文件
- laravel - HTTP 响应中的 remember_me cookie 是如何设置的?