如何同时优化大型递归任务

时间:2019-04-19 08:20:40

标签: go

我有一个计时任务,以在Golang中执行最佳方法。

  1. 我需要将来自Web服务的大数据存储在sellers中的JSON中
  2. 将这些sellers保存在数据库中之后,我需要浏览另一个带有sellersID参数的大型JSON Web服务,以保存到另一个名为customers的表中。
  3. 每个customer都有一个初始状态,如果此状态已从Web服务(n°2)的数据更改,则我需要将差异存储在另一个表{{1}中}具有更改历史记录。
  4. 最后,如果更改等于我们的条件,我将执行另一项任务。

我当前的操作

changes
  • 此代码的第一个困难是我无法控制对Web服务的调用次数。
  • 第二个原因是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() 函数完成了许多我认为可以通过并发方式完成的工作。
  • 第三个困难是在出现错误的情况下我无法恢复到发生错误的地方。

我需要每小时运行一次此代码,因此需要精心构建,目前可以正常运行,但不是最佳方式。 我认为像这样的示例Go by Example: Worker Pools考虑​​在Go中使用工人池,但是我很难想到它

1 个答案:

答案 0 :(得分:-1)

不要混蛋!但是我会在这种事情上使用队列。我已经创建了一个库并使用了它。 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!