Объекты Condition
Объект Condition - Синхронизация потоков в Python
Чтобы более эффективно синхронизировать доступ к любым ресурсам, мы можем связать условие с задачами, чтобы любой поток ожидал выполнения определенного условия или уведомлял другие потоки о выполнении условия, чтобы они могли разблокировать себя.
Давайте рассмотрим простой пример, чтобы понять это. В задаче «Производитель-Потребитель», если есть один производитель, производящий какой-либо предмет, и один Потребитель, потребляющий его, то до тех пор, пока Производитель не произведет элемент, Потребитель не может его потреблять. Следовательно, Потребитель ждет, пока Произведенный не произведет предмет. И обязанность производителя - сообщить потребителю, что товар доступен для потребления, как только он будет успешно произведен.
И если есть несколько Потребителей, потребляющих предмет, произведенный Производителем, то Производитель должен проинформировать всех Потребителей о новом произведенном предмете.
Это идеальный вариант использования объекта условия в многопоточности в Python.
Объект Condition: wait (), notify () и notifyAll ()
Теперь, когда мы знаем, для чего используется объект условия в многопоточности Python, давайте посмотрим на его синтаксис:
Объект условия принимает в качестве аргумента необязательный объект блокировки. Если мы ничего не предоставляем, создается блокировка по умолчанию.
У объекта условия есть методы acquire() и release(), которые вызывают соответствующие методы связанной блокировки. Он также имеет метод wait() и методы notify() и notifyAll(). Эти три должны вызываться только после того, как вызывающий поток получил блокировку.
Методы класса Condition
Ниже приведены методы класса условий:
acquire(*args) method
Этот метод используется для получения блокировки. Этот метод вызывает соответствующий метод acquire() для базовой блокировки, присутствующей в объекте условия; возвращаемое значение - это то, что возвращает этот метод.
release() method
Этот метод используется для снятия блокировки. Этот метод вызывает соответствующий метод release() для базовой блокировки, присутствующей в объекте условия.
wait([timeout]) method
Этот метод используется, чтобы заблокировать поток и заставить его ждать, пока какой-либо другой поток не уведомит его, вызвав метод notify() или notifyAll() для того же объекта условия или пока не истечет время ожидания.
Это должно быть вызвано только тогда, когда вызывающий поток получил блокировку.
При вызове этот метод снимает блокировку, а затем блокирует поток до тех пор, пока он не будет разбужен вызовом notify() или notifyAll() для той же переменной условия из другого потока или до истечения времени ожидания.
Этот метод возвращает True, если он выпущен из-за метода notify() или notifyAll(), иначе, если произойдет тайм-аут, этот метод вернет логическое значение False.
notify() method
Он пробуждает любой поток, ожидающий соответствующего условия. Это должно быть вызвано только тогда, когда вызывающий поток получил блокировку. Кроме того, вызов этого метода разбудит только один ожидающий поток.
notifyAll() method
Он пробуждает все потоки, ожидающие этого условия. Этот метод действует как метод notify(), но пробуждает все ожидающие потоки вместо одного.
Время для примера!
В приведенном ниже примере кода мы реализовали простое решение производитель-потребитель, в котором производитель создает элемент и добавляет его в список, из которого потребитель потребляет элементы.
Несколько важных выводов из приведенного выше примера кода:
Мы создали класс SomeItem, у которого есть список list, который действует как общий ресурс между потоком-производителем и потоком-потребителем.
Поток-производитель случайным образом генерирует некоторые элементы списка и добавляет их в список.
Потребительский поток пытается использовать элемент, если элемент не найден, он начинает ждать. Если производитель отправляет уведомление потребителю о создании элемента до своего тайм-аута, то потребитель потребляет элемент, иначе он выходит из-за тайм-аута.
Это очень простой пример, охватывающий все варианты использования объекта условия. Попробуйте запустить указанную выше программу с двумя потоками потребителей и одним потоком производителя.
Last updated
Was this helpful?