我有一个 chron 任务要在 Golang 中以最佳方式执行。
- 我需要在
sellers
中以 JSON 格式存储来自 Web 服务的大数据
- 将这些
sellers
保存到数据库后,我需要浏览另一个带有sellersID
参数的大型 JSON 网络服务,以保存到另一个名为customers
的表. - 每个
customer
都有一个初始状态,如果这个状态已经从 web 服务的数据改变 (n°2) 我需要将差异存储在另一个表中changes
以获取更改历史记录。 - 最后,如果变化等于我们的条件,我将执行另一项任务。
我目前的操作
var wg sync.WaitGroup
action.FetchSellers() // fetch large JSON and stort in sellers table ~2min
sellers := action.ListSellers()
for _, s := range sellers {
wg.Add(1)
go action.FetchCustomers(&wg, s) // fetch multiple large JSON and stort in customers table and store notify... ~20sec
}
wg.Wait()
- 此代码的第一个困难是我无法控制对网络服务的调用次数。
- 第二个是
action.FetchCustomers
函数做了很多我认为可以以并发方式完成的工作。 - 第三个难点是万一出现错误,我无法在发生错误的地方继续。
我需要每小时运行一次这段代码,因此它需要精心构建,目前它可以工作,但不是以最佳方式。 我认为像这个例子一样考虑在 Go 中使用 Worker Pools Go by Example: Worker Pools但是我很难想象它
最佳答案
不要成为一个 SCSS !但是我会为这种事情使用队列。我已经创建了一个库并使用它。 github.com/AnikHasibul/queue
// Limit the max
maximumJobLimit := 50
// Open a new queue with the limit
q := queue.New(maximumJobLimit)
defer q.Close()
// simulate a large amount of jobs
for i := 0; i != 1000; i++ {
// Add a job to queue
q.Add()
// Run your long long long job here in a goroutine
go func(c int) {
// Must call Done() after finishing the job
defer q.Done()
time.Sleep(time.Second)
fmt.Println(c)
}(i)
}
//wait for the end of the all jobs
q.Wait()
// Done!
关于go - 如何并发优化大型递归任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55758762/