Семафоры и мьютексы являются важными инструментами для обеспечения синхронизации и контроля доступа к ресурсам в многопоточных приложениях на 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, а также привели примеры их использования для синхронизации доступа к ресурсам в многопоточных приложениях. Применение этих инструментов позволяет избежать проблем, связанных с одновременным доступом к критическим ресурсам, и обеспечивает корректную работу вашего кода. 😊
Перейти в телеграм, чтобы получить результаты теста





Забрать
Добавить комментарий