Тесты Пообщаться с GPT Протестировать код
Программирование Аналитика Дизайн Маркетинг Управление проектами
24 Июл 2023
2 мин
3734

Как работать с семафорами и мьютексами в Python

Пройдите тест, узнайте какой профессии подходите

Изучите работу с семафорами и мьютексами в Python для синхронизации доступа к ресурсам в многопоточных приложениях.

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

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