Используйте каналы для реализации механизма повтора в go - PullRequest
1 голос
/ 01 апреля 2020

Я запускаю два параллельных пути выполнения (или goroutines) для выполнения двух заданий


    const Retries = 10

    wg.Add(2)
    go func() {
        for i := 0; i < Retries; i++ {
            retVal1, err1 = doSomeWork()
            if err1 != nil {
                fmt.Printf("WARNING: Error job in attempt no %d: %s - retrying...\n", i+1, err1)
                continue
            } else {
                break
            }
        }
        if err1 != nil {
            log.Fatalf("ERROR job %s\n", err1)
        }
        wg.Done()
    }()
    go func() {
        for i := 0; i < Retries; i++ {
            retVal2, err2 = doSomeWork()
            if err2 != nil {
                fmt.Printf("WARNING: Error job in attempt no %d: %s - retrying...\n", i+1, err2)
                continue
            } else {
                break
            }
        }
        if err2 != nil {
            log.Fatalf("ERROR job %s\n", err2)
        }
        wg.Done()
    }()
    wg.Wait()

У меня вопрос (кроме импорта какой-либо сторонней библиотеки повторов), есть ли еще go -idiomati c способ структурирования приведенного выше кода? Будет ли подход канала / выбора больше go -centri c?

1 Ответ

1 голос
/ 01 апреля 2020

Ваш код не так уж и плох. Использование каналов было бы излишним.

Я бы написал так, что немного легче.

const maxRetries int = 3

go func() {
    var retries int
    for {
        retVal1, err1 = doSomeWork()
        if err1 == nil {
            break
        }
        retries++
        if retries == maxRetries {
            log.Fatalf("ERROR job %s\n", err1)
        }
        fmt.Printf("WARNING: Error job in attempt no %d: %s - retrying...\n", retries, err1)
    }
    wg.Done()
}()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...