Обычный способ сделать это - использовать шаблон «Ядовитая таблетка». По сути, производитель и потребитель договариваются об особом объекте «ядовитой пилюли», который производитель может загрузить в очередь, что будет означать, что больше не будет отправлено ни одного элемента, а потребитель может отключиться.
Итак, в вашем примере это выглядело бы так:
import threading
import queue
import time
q = queue.Queue()
END = object()
def getter():
while True:
item = q.get()
if item == END:
break
print('worker:', item)
time.sleep(2)
def putter():
for i in range(5):
print('putter: ', i)
q.put(i)
time.sleep(3)
q.put(END)
tgetter = threading.Thread(target=getter)
tgetter.start()
tputter = threading.Thread(target=putter)
#tputter.start()
Это немного надумано, так как производитель жестко запрограммирован всегда посылать пять товаров, поэтому вы должны представить, что потребитель не Не знаю заранее, сколько товаров отправит производитель.