为了账号安全,请及时绑定邮箱和手机立即绑定

如果查询限制过大,goroutines 中的 GORM 会冻结

如果查询限制过大,goroutines 中的 GORM 会冻结

Go
慕哥6287543 2023-07-17 14:52:39
我决定建立创建 CSV 报告的服务。使用中:Go 1.12、GORM(作为 PostgreSQL ORM)func main() {  ... // init DB connection etc  defer db.Close()  go fetch(db)  for {} // keeps open process}func fetch(db *gotm.DB) {  .... // some code counts pages, creates file etc  sqlLimit := 20000 // set limit  for i := 0; i < pages; i++ {    db.Table("reports_bookings"),Debug().Where(sql).Offset(i * sqlLimit).Limit(sqlLimit).Find(&myModels)    .... // code: push it to file  }}因此,当代码尝试获取数据时,它就会冻结。例如,如果减少限制并设置 100,则会运行 SQL 2 次并冻结。Debug()也没有显示任何内容。正如我所说,它似乎冻结了。已加载处理器的一个核心。没有 goroutine 也可以正常工作。你能帮我弄清楚为什么它在 goroutine 中不起作用吗?提前致谢。编辑也许我的方法不好,你可以建议如何解决它。最后,文件应该上传到S3(例如)
查看完整描述

1 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

    退出程序之前需要等待所有 goroutine 完成。


func main() {

  ... // init DB connection etc

  wg := sync.WaitGroup{}

  defer db.Close()

  wg.Add(1) // number of goroutines

  go fetch(db, &wg)

  wg.Wait() // wait for goroutines before exiting

}


func fetch(db *gotm.DB, wg *sync.WaitGroup) {

  .... // some code counts pages, creates file etc

  sqlLimit := 20000 // set limit

  for i := 0; i < pages; i++ {

    db.Table("reports_bookings"),Debug().Where(sql).Offset(i * sqlLimit).Limit(sqlLimit).Find(&myModels)

    .... // code: push it to file

    for {} // keeps open process

  }

}

否则,你的程序将在 goroutine 完成之前退出


查看完整回答
反对 回复 2023-07-17
  • 1 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信