Вопрос проверяет понимание примитивов синхронизации и работы многопоточности.
Семафоры и мьютексы используются для синхронизации потоков и предотвращения гонок данных. Мьютекс позволяет только одному потоку выполнять критическую секцию. Семафор позволяет ограничить количество потоков, которые могут работать одновременно. Они применяются при работе с общими ресурсами.
Когда несколько потоков работают с общими данными, может возникнуть ситуация, называемая race condition — результат зависит от порядка выполнения потоков.
Чтобы этого избежать, используются механизмы блокировки.
Определение:
Мьютекс — это примитив синхронизации, который гарантирует, что только один поток может выполнить критическую секцию.
Пример:
lock = threading.Lock()
with lock:
shared_counter += 1
Пока один поток удерживает lock, остальные ждут.
Определение:
Семафор — это счетчик, который ограничивает количество потоков, имеющих доступ к ресурсу одновременно.
Пример:
sem = threading.Semaphore(3)
with sem:
process_request()
Одновременно выполнятся не более 3 потоков.
Ограничение количества подключений
Пулы соединений
Ограничение API-запросов
Работа с файлами или оборудованием
Мьютекс:
бинарная блокировка
один поток
Семафор:
счетчик
несколько потоков
Мьютекс применяют для защиты данных, семафор — для ограничения параллелизма.