go - 如何并发优化大型递归任务

标签 go

我有一个 chron 任务要在 Golang 中以最佳方式执行。

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

我目前的操作

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/

相关文章:

android - native 库没有从 golang 条件实现加载到 apex_defaults?

go - Google Anthos实现-PAAS

涉及自定义类型指针的 Go 赋值

go - 如何在golang中将65537转换为AQAB

结构初始化以满足没有显式方法定义的接口(interface)

c - Go 代码使用 getdents() 列出 Linux 目录中的文件

websocket - 将 io 字符串转为 int Atoi 无效参数

go - 将 stdout/stderr 重定向到一个函数的最佳方法是什么,该函数反过来格式化消息并将其打印到控制台?

go - channel 以死锁结束的范围

go - golang 中的 nil 是什么意思?