Как оптимизировать большую рекурсивную задачу одновременно - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть задача chron, чтобы выполнить ее наилучшим образом на Голанге.

  1. Мне нужно хранить большие данные из веб-службы в JSON в sellers
  2. После сохранения этих sellers в базе данных, мне нужно просмотреть другой большой веб-сервис JSON с параметром sellersID, чтобы сохранить в другую таблицу с именем customers.
  3. Каждый customer имеет начальное состояние, если это состояние изменилось сданные веб-службы (n ° 2) мне нужно сохранить разницу в другой таблице changes, чтобы иметь историю изменений.
  4. Наконец, если изменение равно нашемуусловия Я выполняю другое задание.

Моя текущая операция

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 выполняет большую часть работы, которая, я думаю, может быть выполнена параллельным способом.
  • Третья трудность состоит в том, что я не могу возобновить работу, если ошибкапроизошли в случае ошибок.

Мне нужно запускать этот код каждый час, поэтому он должен быть хорошо собран, в настоящее время он работает, но не лучшим образом.Я думаю, что с учетом использования Workol Pools в Go, как в этом примере Go на примере: Worker Pools Но у меня возникают проблемы с его созданием

1 Ответ

0 голосов
/ 19 апреля 2019

Не быть придурком!Но я бы использовал очередь для такого рода вещей.Я уже создал библиотеку и использую это.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!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...