'''
練習:線程通信二:
a、使用Condition實現線程通信
b、使用Queue控制線程通信(實例)
c、使用Event控制線程通信
******************************************
queue提供三種形式:標準隊列(先進先出)、棧隊列(先進後出)、優先級隊列
queue.Queue(maxsize = 0)、queue.LifoQueue(maxsize=0)、PriorityQueue(maxsize=0)
這三種隊列都提供瞭如下的方法:
Queue.qsize():返回隊列的實際大小,就是該隊列中包含幾個元素
Queue.empty():
Queue.full():
Queue.put(item,block=True,timeout=None):如果隊列已滿,並且block=True;
當前線程被阻塞;如果隊列已滿,並且block=False,則直接引發queue.Full異常
timeout設置爲None則代表一直阻塞
Queue.put(item):向隊列中放入一個元素,不阻塞;相當於上一個函數設置block=False
Queue.get(item,block=True,timeout=None):如果隊列已空,並且block=True;
當前線程被阻塞;如果隊列已空,並且block=False,則直接引發queue.EMPTY異常
timeout設置爲None則代表一直阻塞
Queue.get():向隊列中放入一個元素,不阻塞;相當於上一個函數設置block=False
'''
import threading
import queue
import time
def product(bq):
'''隊列的put方法,放置元素到隊列中'''
str_tuple = ("Python","Java","Javascript","Avisynth","Bat")
for i in range(10):
time.sleep(0.2)
#嘗試放入隊列,如果隊列滿則線程被阻塞
bq.put(str_tuple[i%5])
print(threading.current_thread().name + "生產者生產元素完成")
print("**"*20)
def consum(bq):
'''隊列的get方法,隊列中元素出來'''
while True:
#嘗試取出元素,如果隊列爲空,則線程阻塞
t = bq.get()
print(threading.current_thread().name+"消費【%s】元素"%t)
print("- "*20)
#創建一個容量爲1的queue
bq = queue.Queue(1)
#啓動三個生產者進程
threading.Thread(name="玫瑰產線", target=product, args=(bq,)).start()
threading.Thread(name="牡丹產線", target=product, args=(bq,)).start()
threading.Thread(name="荷花產線", target=product, args=(bq,)).start()
#啓動一個消費者進程
threading.Thread(name="學習者", target=consum, args=(bq,)).start()