首页 > 解决方案 > 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,它很好并且在创建过程中没有错误,有人知道为什么会发生这种情况以及如何处理吗?

标签: goconcurrencygoroutine

解决方案


每个 goroutine 都有自己的堆栈。如果堆栈没有恢复,程序将悲惨地退出。建议:不要使用panic来控制业务逻辑。

问题是:为什么?如果userJobRepository.CreateuserContactRepository.Create失败,用户将永远不会知道它,并且您的服务器将死机。


推荐阅读