【Python】-線程同步(二)-Queue

'''
練習:線程通信二:
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()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章