1. 程式人生 > >用面向物件重寫thread 實現多次呼叫一個執行緒

用面向物件重寫thread 實現多次呼叫一個執行緒

思路:

  利用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("結束 ")
圖例: