Sobes.tech
Назад к вопросам
Junior — Middle
59

Какие основные механизмы для синхронизации потоков или процессов тебе знакомы?

Компании, где спрашивали
WildberriesWildberries
Инновационный центр Безопасный транспорт

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Нужно показать, что известны базовые примитивы синхронизации и понимается, зачем они нужны: защита общих данных, координация выполнения и ожидание завершения работы. Для Python важно отдельно упомянуть, что из-за GIL не все механизмы про параллельный CPU-код, но синхронизация между потоками и процессами всё равно нужна. Хороший ответ обычно включает Lock, RLock, Event, Condition, Semaphore, Queue, а для процессов — синхронизацию из multiprocessing.

Определение:

Синхронизация — это набор механизмов, которые управляют доступом нескольких потоков или процессов к общим ресурсам и помогают избежать гонок, повреждения данных и некорректного порядка выполнения.
В Python эти механизмы используются, чтобы безопасно разделять состояние, ждать события, ограничивать число одновременных исполнителей и передавать данные между конкурентными задачами.

Пример использования:

Типичный пример — несколько потоков увеличивают общий счётчик, и без блокировки значение может стать неверным из-за race condition.

import threading

counter = 0
lock = threading.Lock()

def worker():
    global counter
    for _ in range(100_000):
        with lock:
            counter += 1

threads = [threading.Thread(target=worker) for _ in range(4)]

for t in threads:
    t.start()

for t in threads:
    t.join()

print(counter)

Пояснение кода:

В этом примере код нужен, потому что есть общий изменяемый ресурс — counter.
Сначала создаётся Lock, который разрешает выполнять критическую секцию только одному потоку за раз.
Каждый поток многократно пытается увеличить счётчик, но операция counter += 1 защищена with lock, поэтому два потока не могут одновременно прочитать и записать одно и то же значение.
После запуска потоков основной поток ждёт их завершения через join(), и только потом выводит итог.

Ключевые моменты:

  • Lock — базовый механизм взаимного исключения для защиты критической секции.
  • RLock нужен, когда один и тот же поток может захватывать блокировку повторно.
  • Event подходит для сигнала «произошло событие», когда нужно разбудить ожидающие потоки.
  • Condition используют для сложной координации: ожидание изменения состояния под блокировкой.
  • Semaphore ограничивает число одновременно работающих потоков или доступов к ресурсу.
  • Queue удобна для безопасной передачи данных между потоками и часто заменяет ручную синхронизацию.
  • Для процессов применяют механизмы из multiprocessing, а не threading, потому что память у процессов общая не по умолчанию.