1. 程式人生 > >用面向對象重寫thread 實現多次調用一個線程

用面向對象重寫thread 實現多次調用一個線程

reading img 面向對象 run方法 消費者 任務 調用 生產者 true

思路:

  利用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("結束 ")
圖例:
    技術分享圖片

 

用面向對象重寫thread 實現多次調用一個線程