тикер до сих пор живет в памяти - PullRequest
0 голосов
/ 26 декабря 2018

Почему, когда я инициализирую тикер, а затем обновляю его, оригинальный тикер все еще остается в памяти, и если я сделаю цикл, он очень скоро убьет мою оперативную память

timeOut := 10
ticker := time.NewTicker(time.Duration(timeOut) * time.Second)
for {
    ticker = time.NewTicker(time.Duration(timeOut) * time.Second)
}

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018
for {
    ticker = time.NewTicker(time.Duration(timeOut) * time.Second)
}

Это создаст экземпляры тикера как можно быстрее, и из-за природы объектов тикера они не смогут очистить (на них ссылается реализация билета, которая из-за его асинхронностиприрода, бывает в другом рутине).Go может сделать это очень быстро, что очень быстро приводит к ошибке OOM (нехватка памяти).

Но этот шаблон не имеет никакого смысла.Нет смысла создавать такие тикеры в цикле for.Вы можете создавать несколько тикеров, даже очень много, но вы не можете создавать бесконечные тикеры, и при этом нет особого смысла делать это.

Кроме того, обратите внимание, что вы на самом деле не используете ваши тикеры в любом месте.Рассмотрим пример здесь: https://gobyexample.com/tickers.Вы увидите, как они взаимодействуют с тикером для запуска кода с каждым тиком.Обратите внимание, что тикер там создается один раз , а не в цикле.

0 голосов
/ 26 декабря 2018

Пакетное время

import "time"

func NewTicker

func NewTicker (d Duration) * Тикер

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


Следуйте инструкциям: остановите тикер для освобождения связанных ресурсов.

...