Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: idempotent, close, sync

Как спроектировать компонент, который безопасно завершает работу при параллельных вызовах Close?

Вопрос проверяет умение проектировать потокобезопасные API и корректный shutdown.

Короткий ответ

Метод Close должен быть идемпотентным и потокобезопасным. Обычно используется sync.Once, mutex или atomic флаг. Это гарантирует, что ресурс будет закрыт только один раз. Остальные вызовы Close не должны приводить к ошибкам.

Длинный ответ

Компоненты в конкурентных системах часто закрываются из разных частей программы.

Определение:
Идемпотентный Close — это метод, который можно вызывать несколько раз без побочных эффектов.

Основные требования

Компонент должен:

  1. Закрываться только один раз.

  2. Не вызывать panic.

  3. Освобождать ресурсы корректно.

Подход 1 — sync.Once

Самый распространенный вариант:

type Worker struct {
    once sync.Once
}

func (w *Worker) Close() {
    w.once.Do(func() {
        // освобождение ресурсов
    })
}

Подход 2 — atomic флаг

Подходит для простых случаев:

if atomic.CompareAndSwapInt32(&closed, 0, 1) {
    // закрытие
}

Подход 3 — mutex

Используется, если логика сложнее:

  1. Проверка состояния.

  2. Закрытие.

  3. Изменение флага.

Дополнительные элементы

Часто добавляют:

  1. Context cancellation.

  2. Канал завершения.

  3. WaitGroup.

Вывод

Безопасный Close строится вокруг идемпотентности и синхронизации, чтобы гарантировать корректное освобождение ресурсов даже при параллельных вызовах.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • Golang

    Golang

Ключевые слова

#idempotent

#close

#sync

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.