Материал проходит вычитку — возможны неточности.
Урок 95 из 118

sync.Pool

Буферы загрузки создавались на каждый запрос заново, и сборщик мусора собирал их тысячами. Миша завёл общий пул: отработанный буфер возвращался в него и доставался следующему запросу. Память перестала скакать на пиках.

Главная мысль

sync.Pool — кэш временных объектов: Get забирает готовый, создаёт через New или возвращает nil, Put кладёт обратно без гарантии сохранения; это способ переиспользовать аллокации и снять давление с GC.

Буферы для ответов

Go

Get возвращает объект из пула или, если пул пуст, создаёт через New. Без New при пустом пуле Get вернёт nil. Put кладёт объект обратно, но не гарантирует, что он там останется. Вместо аллокации на каждый запрос — переиспользование: сервер с тысячами запросов в секунду экономит тысячи буферов.

Почему Reset обязателен

Get может вернуть объект, которым уже пользовались, — с остатками прошлых данных. Поэтому перед Put объект приводят в нулевое состояние: buf.Reset — и только потом возвращают. Положил «грязный» объект — получил грязные данные в следующем запросе.

Чего Pool не обещает

Пул — не гарантированное хранилище: GC может очистить его целиком в любой момент. Объекты из пула — строго временные, между Get и Put. Для долгоживущих вещей (соединения, кэши) Pool не подходит: они должны пережить сборку мусора, а пул — нет.

В следующем уроке

Вы узнаете:

  • как пул снижает давление на GC
  • когда Pool не даёт выигрыша
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

Объект положили в sync.Pool и вызвали runtime.GC(). Что вернёт следующий Get?

Вопрос 2 из 3

Зачем делать Reset перед Put?

Вопрос 3 из 3

Для чего на самом деле нужен sync.Pool?

Итоги

Pool — переиспользование временных объектов: Get/Put с Reset; без New пустой Get даёт nil, положенное может исчезнуть в любой момент. Это про снижение давления на GC, а не про кэш.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки