Сообщество RSS DEV

Идите на синхронизацию. Пул и механика, стоящая за ним

Пул потокобезопасного объекта sync.Pool позволяет переиспользовать временные объекты, уменьшая использование памяти и затраты на сборку мусора. Он поддерживает несколько локальных пулов, связанных с контекстами процессоров, оптимизируя извлечение объектов для горутин, работающих на этих процессорах. Когда объект запрашивается из пула, он сначала проверяет локальный пул для того процессора. Если объект найден, он переиспользуется; в противном случае создается новый объект и добавляется в локальный пул. Когда объект возвращается в пул, не гарантируется, что он будет немедленно переиспользован и может быть удален в любой момент. Функция New() может быть использована для создания новых объектов, когда пул пуст. Если не предоставлена, пул возвращает nil, когда пуст. Чтобы получить объект из пула, используйте pool.Get(). Чтобы вернуть объект в пул, используйте pool.Put(). Типовые утверждения могут быть избежены при извлечении объектов, используя выделенную функцию или создавая универсальную версию sync.Pool. Хранение указателей на объекты в пуле предотвращает ненужные выделения памяти в куче и улучшает анализ побега. Сcheduling PMG обеспечивает то, что каждый процессор может запускать только одну горутину за раз, оптимизируя доступ к пулу для горутин, работающих на этом процессоре. sync.Pool широко используется в стандартной библиотеке Go, например, в encoding/json и net/http, для оптимизации операций ввода-вывода и переиспользования временных объектов.
favicon
dev.to
Go sync.Pool and the Mechanics Behind It