用面向物件重寫thread 實現多次呼叫一個執行緒
阿新 • • 發佈:2018-11-22
思路:
利用thread類中,run方法在子執行緒中呼叫,其他方法在主執行緒呼叫,所以將生產者寫入主執行緒,將消費者寫入run函式中在子執行緒中執行,完成生產者消費者模型
注意:
1. 要在 init 函式中例項化一個Queue佇列作為生產者消費者中介
2. 要在 init 函式中把daemon值設為True ,把該執行緒設定為守護程序,不然結束不了執行緒
3. 一般執行緒的 .join() 函式 滿足不了當前功能,需重寫,用計數器控制的queue.join() 代替
4. start()函式可以在外部呼叫,也可寫在 init 函式中,省去外部呼叫的步驟
程式碼:
import threading
import queue
#消費者與生產者模式去實現我們可重複利用的執行緒
#主執行緒為生產者,子執行緒為消費者
class Mythread(threading.Thread):
def __init__(self):
super().__init__()
self.q = queue.Queue()
self.daemon = True #設定守護執行緒,主執行緒結束,子執行緒接著結束
self.start()
def run(self): #run裡面的東西是在我們的子程序裡面去執行,且只有run是在子程序裡面
while True:
func = self.q.get() #拿任務
func() #執行任務
self.q.task_done()
def pro(self,func): #定義生產者函式
self.q.put(func)
def join(self):
self.q.join() #阻塞,直到計數器為0
def func1():
print(1)
def func2():
print(2)
t = Mythread()
# t.start() #可以寫在類定義的init函式中,省去這一步
t.pro(func1)
t.pro(func2)
t.pro(func1)
t.join()
print("結束 ")
圖例: