Семафоры и мьютексы являются важными инструментами для обеспечения синхронизации и контроля доступа к ресурсам в многопоточных приложениях на Python. В этой статье мы рассмотрим принципы работы с семафорами и мьютексами, а также рассмотрим примеры их использования.
Семафоры
Семафоры используются для контроля доступа к ограниченному числу ресурсов. Они представляют собой объекты, имеющие счетчик, который уменьшается при каждом захвате ресурса и увеличивается при его освобождении.
Пример использования семафора
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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») — это специальный вид семафора, используемый для предотвращения одновременного доступа к критическому ресурсу. В отличие от семафора, мьютекс имеет только два состояния: заблокирован и разблокирован.
Пример использования мьютекса
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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, а также привели примеры их использования для синхронизации доступа к ресурсам в многопоточных приложениях. Применение этих инструментов позволяет избежать проблем, связанных с одновременным доступом к критическим ресурсам, и обеспечивает корректную работу вашего кода. 😊
Добавить комментарий