自定義執行緒池、內建執行緒池.md
阿新 • • 發佈:2018-12-14
自定義簡單執行緒池
python執行緒是可以重複利用的,如果呼叫的時候每次都建立一個執行緒,則太浪費資源了
我把多執行緒比作服務員,每次有客人來的時候,都分配一個專門的服務員去服務;
當客人走了之後,服務員回到空閒狀態,繼續等待新的客人
import threading
from queue import Queue
class MyThread(threading.Thread):
def __init__(self,x=5): #定於迴圈次數,預設服務員數量
self.queue = Queue()
for i in range(1,x+1): #一次性建立個個執行緒,並讓他們處於啟用狀態
threading.Thread(target=self.run,daemon=True,name=f'服務員{i}').start() #啟用執行緒
def run(self): #客人到來怎麼服務就寫在這個方法裡面了
while True:
print(f'{threading.current_thread().name}等待任務中...')
a = self.queue.get() ##佇列等待客人到來
print(threading.current_thread().name,a) #等待到客人進行服務
self.queue. task_done() #告訴佇列服務完成,回到空閒狀態去接待其他客人
def apply_async(self,func):
self.queue.put(func) #這個方法給佇列新增任務,相當於去拉客人,拉到客人後服務員得到客戶進行服務
def join(self):
self.queue.join() #等待所有服務員都服務完成,才準程式結束。
if __name__ == '__main__':
x = MyThread()
for i in range(60):
x.apply_async(i)
x.join()
#結果部分預覽
服務員1 等待任務中...
服務員2等待任務中...
服務員3等待任務中...
服務員4等待任務中...
服務員5等待任務中...
服務員5 0
服務員1 1
服務員2 2
服務員2等待任務中...
服務員2 3
服務員2等待任務中...
服務員2 4
服務員2等待任務中...
哪個服務員去服務客戶是用系統呼叫的,可以看到服務員2服務了很多客人
內建執行緒池
from multiprocessing.pool import ThreadPool
import time
pool = ThreadPool(2) #例項化執行緒池,括號內給定執行緒池數量,不給系統有預設的
def task1():
time.sleep(3)
print('任務1完成...')
def task2():
time.sleep(3)
print('任務2完成...')
pool.apply_async(task1) #給執行緒池新增任務
pool.apply_async(task2) #給執行緒池新增任務
print('任務提交完成!')
pool.close() #新增任務完成之後,關閉執行緒池,此時不允許再提交新任務
pool.join() #d等待任務全部完成才會繼續往下執行
print('任務全部完成')
#結果預覽
任務提交完成!
任務1完成...
任務2完成...
任務全部完成
[Finished in 3.4s]
個人筆記,有錯誤你們就當沒看到吧?