Очередь

Процесс, показанный в предыдущем примере, имеет значение, достойное отдельного модуля. Такой модуль в стандартной библиотеке языка 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):

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

 item.put(i)

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()

Следует отметить, что все блокировки спрятаны в реализации очереди, поэтому в коде они явным образом не присутствуют.

Больше книг — больше знаний!

Заберите 30% скидку новым пользователям на все книги Литрес с нашим промокодом

ПОЛУЧИТЬ СКИДКУ