1. 程式人生 > >自定義執行緒池、內建執行緒池.md

自定義執行緒池、內建執行緒池.md

自定義簡單執行緒池

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]

個人筆記,有錯誤你們就當沒看到吧?