Решение проблемы парикмахера с использованием семафоров в Python: руководство по синхронизации

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