Семафоры и мьютексы являются важными инструментами для обеспечения синхронизации и контроля доступа к ресурсам в многопоточных приложениях на Python. В этой статье мы рассмотрим принципы работы с семафорами и мьютексами, а также рассмотрим примеры их использования.
Семафоры
Семафоры используются для контроля доступа к ограниченному числу ресурсов. Они представляют собой объекты, имеющие счетчик, который уменьшается при каждом захвате ресурса и увеличивается при его освобождении.
Пример использования семафора
import threading # Создаем семафор с максимальным значением 3 semaphore = threading.Semaphore(3) def access_resource(): print(f'{threading.current_thread().name} ожидает доступ к ресурсу') semaphore.acquire() print(f'{threading.current_thread().name} получил доступ к ресурсу') # Тут выполняется работа с ресурсом semaphore.release() print(f'{threading.current_thread().name} освободил ресурс') threads = [] for i in range(5): thread = threading.Thread(target=access_resource) threads.append(thread) thread.start() for thread in threads: thread.join()
Мьютексы
Мьютекс (от англ. «MUTual EXclusion») — это специальный вид семафора, используемый для предотвращения одновременного доступа к критическому ресурсу. В отличие от семафора, мьютекс имеет только два состояния: заблокирован и разблокирован.
Пример использования мьютекса
import threading mutex = threading.Lock() shared_resource = 0 def access_resource(): global shared_resource print(f'{threading.current_thread().name} ожидает доступ к ресурсу') mutex.acquire() print(f'{threading.current_thread().name} получил доступ к ресурсу') shared_resource += 1 mutex.release() print(f'{threading.current_thread().name} освободил ресурс') threads = [] for i in range(5): thread = threading.Thread(target=access_resource) threads.append(thread) thread.start() for thread in threads: thread.join() print(f'Значение shared_resource: {shared_resource}')
В этой статье мы рассмотрели основы работы с семафорами и мьютексами в Python, а также привели примеры их использования для синхронизации доступа к ресурсам в многопоточных приложениях. Применение этих инструментов позволяет избежать проблем, связанных с одновременным доступом к критическим ресурсам, и обеспечивает корректную работу вашего кода. 😊
Добавить комментарий