Ключевые слова: проблема Барбера, семафоры, синхронизация, Python, параллелизм, многопоточность
В этой статье блога мы углубимся в классическую проблему синхронизации, известную как проблема парикмахера, и рассмотрим различные методы ее решения с использованием семафоров в Python. Мы будем использовать разговорный язык и приводить примеры кода, чтобы сделать тему более понятной. Итак, начнём!
Проблема парикмахера.
Представьте себе парикмахерскую с одним парикмахерским креслом и несколькими стульями для ожидания клиентов. Парикмахер может одновременно стричь волосы только одному клиенту. Если клиентов нет, парикмахер спит в своем кресле. Когда приходит клиент и видит спящего парикмахера, он будит парикмахера и садится в парикмахерское кресло. Если свободных стульев нет, покупатель покидает магазин. Проблема состоит в том, чтобы разработать решение, обеспечивающее правильную синхронизацию между парикмахером и клиентами.
Метод 1: использование семафоров
Мы можем решить проблему Барбера, используя семафоры, которые являются примитивом синхронизации в Python. Семафоры позволяют нам контролировать доступ к общим ресурсам и управлять порядком выполнения потоков. Давайте посмотрим, как мы можем реализовать это решение:
from threading import Semaphore, Thread
barber_ready = Semaphore(0)
customer_ready = Semaphore(0)
mutex = Semaphore(1)
waiting_customers = 0
def barber():
while True:
customer_ready.acquire()
mutex.acquire()
waiting_customers -= 1
barber_ready.release()
mutex.release()
# Perform haircut
def customer():
mutex.acquire()
if waiting_customers < NUM_CHAIRS:
waiting_customers += 1
customer_ready.release()
mutex.release()
barber_ready.acquire()
# Get haircut
else:
mutex.release()
# Leave the shop
# Create barber and customer threads
barber_thread = Thread(target=barber)
customer_thread = Thread(target=customer)
# Start the threads
barber_thread.start()
customer_thread.start()
Объяснение:
- Мы инициализируем три семафора:
barber_ready
,customer_ready
иmutex
. - Переменная
waiting_customers
отслеживает количество ожидающих клиентов. - Функция
barber()
представляет поведение парикмахера. Он ожидает, пока клиент подаст сигналcustomer_ready
, уменьшает количество ожидающих клиентов и подает сигналbarber_ready
, чтобы указать, что парикмахер готов выполнить стрижку. - Функция
customer()
отображает поведение клиента. Он проверяет, есть ли свободное кресло, подает сигналcustomer_ready
, чтобы разбудить парикмахера, и ждетbarber_ready
, чтобы подстричься. Если свободных стульев нет, покупатель покидает магазин. - Мы создаем отдельные темы для парикмахера и клиента и запускаем их.
В этой статье мы рассмотрели один метод решения проблемы парикмахера с использованием семафоров в Python. Используя семафоры, мы добились правильной синхронизации между парикмахером и клиентами, гарантируя, что парикмахер стрижет волосы, когда есть клиенты, и спит, когда их нет. Понимание синхронизации и использование примитивов, таких как семафоры, имеет решающее значение при работе с параллельным программированием.