Go 1.23
версия по пекинскому времени 2024 Год 8 луна 14 раннее утро 1:03 выпускать。Эта версия содержит несколько крупных обновлений.,Конкретное содержание можно найти в моем предыдущемизстатья:Вышла версия Go 1.23, вы должны знать эти важные обновления!。В этой статье речь пойдет о таймере(Timer
и Ticker
)изоптимизация。
Вы готовы? Возьмите чашку любимого кофе или чая и узнайте, прочитав эту статью.
Углубленное обсуждение Go 1.23
пара версий Timer
и Ticker
Прежде чем оптимизировать таймеры, некоторым читателям может потребоваться понять базовые знания об этих двух таймерах. Ниже приводится базовое введение в эти два таймера:
Timer
это один разизтаймер,используется длясуществоватьбудущееиз Выполнить операцию в определенное время。Обычно используется для однократного отложенного выполнения задач.。Tciker
является циклическимизтаймер,Используется для многократного выполнения задач через фиксированные промежутки времени. Оно существует каждый интервал наступает,канал к этому(Channel
)Отправить текущее время。Часто используется для выполнения повторяющихся задач.。подробнее о Timer
и Ticker
из Подробное введение,Вы можете обратиться к моему предыдущемуизстатья:Go Таймер: Таймер и Ticker。
Timer
или Ticker
явно не вызывается Stop
метод,Даже если программа больше не ссылается на них,Их также не сразу вывозят мусором.。Timer
будут переработаны после срабатывания, и Ticker
никогда не будут автоматически переработаны.Timer
или Ticker
(то есть никаких других частейизкод хранит ихиз Цитировать),Даже без звонка Stop
методы, они также сразу же получат право на сбор мусора. Это снижает риск утечек памяти, поскольку явные вызовы Stop
Это также гарантирует, что ресурсы будут переработаны.Это обновление повышает эффективность управления памятью. Раньше, если вы создавали Timer
или Ticker
,Но забыл позвонить Stop
,Эти объекты всегда будут занимать память,пока программа не завершится. И сейчас существуют,Пока программа больше не ссылается на эти объекты,они будут переработаны,Это поможет избежать проблем с утечкой памяти.
Timer
или Ticker
Связанный канал принимает буфер элемента, что приводит к Reset
или Stop
методсуществовать После звонка,Может по-прежнему получать старое значение, которое было подготовлено ранее,Вызывает трудности в использовании.Reset
или Stop
После метода Go Гарантируется, что старое значение не будет получено снова. Это делает Reset
и Stop
из более надежен в использовании.len
и cap
Операция становитсяиз значения становится 0,вместо 1。Это может повлиять на тех, кто полагается на опрос длины канала, чтобы определить, может ли значение быть успешно получено.изкод。Чтобы адаптироваться к этим изменениям,Код должен использовать неблокирующий Вместо этого выполните операцию получения.Это обновление делает работу таймера более надежной и безопасной. существовать Go 1.23
До,Timer
и Ticker
Канал буферизуется, а это значит, что даже если вы позвоните Reset
или Stop
,Старые сигналы синхронизации могут все еще оставаться в канале.,Это может привести к потенциальной гонке. Сейчас существование изменено на небуферизованный канал,Go
Гарантированный звонок Reset
или Stop
После этого канал больше не будет получать старые данные.
Давайте посмотрим на различия в следующих кодах из существующих. Go
Статус работы в версии:
package main
import (
"fmt"
"time"
)
func main() {
// сигнал выхода из программы
quit := make(chan bool)
timer := time.NewTimer(2 * time.Second)
go func() {
// Убедитесь, что таймер сработал и отправил сигнал.
time.Sleep(4 * time.Second)
// Пытаюсь прочитать канал, чтобы увидеть, есть ли значение.
select {
case t := <-timer.C:
fmt.Println("Получен сигнал таймера:", t.Format(time.DateOnly))
default:
fmt.Println("Нет сигнала")
}
quit <- true
}()
// Убедитесь, что таймер сработал и отправил сигнал.
time.Sleep(3 * time.Second)
wasStopped := timer.Stop()
if wasStopped {
// Go 1.23 или более поздние версии займут эту ветку
fmt.Println("Таймер не истек, остановлен успешно")
} else {
// Go 1.23 Предыдущая версия использовала эту ветку
fmt.Println("Таймер истек и сигнал отправлен")
}
// Ждите сигнала выхода
<-quit
}
существовать Go 1.22
И результаты работы предыдущих версий:
Таймер истек и сигнал отправлен.
Получен сигнал таймера: 2024-08-20
Потому что канал буферизуется,существует Сигнал был отправлен по истечении времени таймера,Так что даже еслисуществоватьтаймер触发после调用 Stop()
метод, мы все еще можем получить сигнал из буфера.
существовать Go 1.23
или Более высокая версия из Результаты работы:
Таймер не истек и был успешно остановлен.
Нет сигнала
Поскольку канал не буферизован, передача сигналов представляет собой операцию блокировки. Если сигнал существует до вызова Stop()
метод,Это предотвратит отправку сигнала. поэтому,Таймер успешно остановлен,Stop()
возвращаться true
。
для Timer
и Ticker
из Эти новые модели поведения существуют только Go
Использование модуля go.mod
файл и указан Go 1.23.0
Или Это вступит в силу только в более поздних версиях. То есть, если вы Go
версия Go 1.23
,но тысуществовать go.mod
указано в файле Go
версия меньше чем Go 1.23
,Тогда эти новые модели поведения не вступят в силу.
Кроме того, если вы существуете go.mod
указано в файле Go
версия больше или равна Go 1.23
,Вы можете установить переменные среды с помощью GODEBUG
из asynctimerchan=1
,Тем самым возвращаясь к предыдущему поведению асинхронного канала.
В этой статье подробно описано существование Go 1.23
Верно в версии Timer
и Ticker
из重要оптимизация,Включает в себя два основных аспекта:Улучшения в сборе мусора и Изменения в поведении канала таймера。После улучшенияиз Механизм сбора мусора помогает предотвратить утечки памяти,А регулировка канала таймера обеспечивает существование вызовов Reset
или Stop
после,Канал не будет получать старые данные.,Повышена надежность и безопасность работы таймера.
Последующие выпуски будут разделены по темам подробнее о Go 1.23
из Подробное содержание обновления. СОЗРЕЗОДЕГО меня, не пропустите ни одного интересного контента.