quot;""Занесение нового элемента в контейнер и оповещение потоков""" 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

quot;""Занесение нового элемента в контейнер и оповещение потоков"""

Поиск

print consume()

 

def produce(i):

 

"""Занесение нового элемента в контейнер и оповещение потоков"""

cv.acquire()

 

item.make(i)

 

cv.notify()

cv.release()

 

p1 = threading.Thread(target=consumer, name="t1") p1.setDaemon(True)

 

p2 = threading.Thread(target=consumer, name="t2") p2.setDaemon(True)

 

p1.start()

p2.start()

 

produce("ITEM1")

 

produce("ITEM2")

produce("ITEM3")

 

produce("ITEM4")


 


p1.join()

 

p2.join()

 

В этом примере условие cv отражает наличие необработанных элементов в контейнере item.Функция produce()"производит"элементы,а consume(),работающая внутри потоков, "потребляет".Стоит отметить,что в приведенном виде программа никогда не закончится,так как имеет бесконечный цикл в потоках,а в главном потоке-ожидание завершения этих потоков.Еще одна особенность-признак демона,установленный с помощью метода setDaemon() объекта-потока до его старта.

 

Очередь

 

Процесс,показанный в предыдущем примере,имеет значение,достойное отдельного модуля.Такой модуль в стандартной библиотеке языкаPythonесть,и он называется Queue.

 

Помимо исключений-Queue.Full(очередь переполнена)и Queue.Empty(очередь пуста) -модуль определяет класс Queue,заведующий собственно очередью.

 

Собственно,здесь можно привести аналог примера выше,но уже с использованием класса

 

Queue.Queue:

 

import threading, Queue

 

item = Queue.Queue()

 

def consume():

 

"""Потребление очередного элемента (с ожиданием его появления)""" return item.get()

 

def consumer(): while True:

 

print consume()

 

def produce(i):

 



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 94; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.128 (0.007 с.)