Какие основные механизмы для синхронизации потоков или процессов тебе знакомы?
Ответ от нейросети
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, потому что память у процессов общая не по умолчанию.