Golang для выбора цикла потребляет 100% процессорного времени - PullRequest
0 голосов
/ 27 марта 2019

У меня есть ресурс, который необходимо загрузить, прежде чем доступ к нему разрешен. Он также должен обновляться каждую минуту.

Каналы имеют длину 1 struct {}, поэтому цикл будет заблокирован, если ресурс не был загружен.

Этот код ниже начал использовать 100% моего процессора, я попытался добавить

time.Sleep(10 * time.Millisecond)

Что привело к снижению потребления процессора приложением до 1%

Я думаю, что тикер был бы лучшим вариантом для временной коллекции.

Есть идеи, почему он потребляет 100% ресурсов процессора, или есть идеи получше?

func (al *AsyncLoop) Run() {
    go func() {
        for {
            select {
            case <-al.chanFetchRequest:
                if al.fetched == false {
                    al.fetchData()
                } else if al.lastUpdated.Add(1*time.Minute).Unix() < time.Now().Unix() && al.fetching == false {
                    go al.fetchData()
                }
                al.chanFetchResponse <- struct{}{}
                continue
            default:
                continue
            }
        }
    }()
}

1 Ответ

0 голосов
/ 27 марта 2019

Я думаю, что вы просто публикуете в al.chanFetchRequest, когда появляются новые данные, поэтому я думаю, что вы должны постоянно читать с этого канала.Добавление тикера к выбору может привести к извлечению данных, даже если они не изменились или (что еще хуже) еще до их загрузки.Почему бы, в обычном случае, не тратить время на извлечение данных, а в следующий раз убедитесь, что вы подождали достаточно времени, прежде чем извлекать снова.Как то так:

        var nextFetch time.Time
        for {
            select {
            case <-al.chanFetchRequest:
                if al.fetched == false {
                    al.fetchData()
                    nextFetch = time.Now().Add(1 * time.Minute)
                } else if time.Now().After(nextFetch) {
                    al.fetchData()
                    nextFetch = time.Now().Add(1 * time.Minute)
                }
                al.chanFetchResponse <- struct{}{}
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...