標籤:shutdown ast nbsp 先進先出 current 線程池 int get 組元
一. 線程隊列
引入線程隊列 : import queue #和普通隊列引入方法相同
線程隊列方法 :
q = queue.Queue() #執行個體化對列,先進先出
q = queue.LifoQueue() #執行個體化隊列,後進先出 ( Last in, first out )
q = queue.PriorityQueue() #執行個體化隊列,優先順序隊列
優先順序隊列,put() 方法接收的是一個元組,第一個元素是優先順序,第二個元素是資料
優先順序如果為數字,按照數字大小比較
如果優先順序是字串或特殊字元,按照字串或特殊字元的ASCII碼比較,如果ASCII碼相同,按照先進先出原則取出
import queue# q = queue.Queue()#先進先出# q.put(1)# q.put(2)# q.put(3)# q.put(4)# print(q.get())# q = queue.LifoQueue()#後進先出# q.put(1)# q.put(2)# q.put(3)# q.put(4)# print(q.get())q = queue.PriorityQueue()#優先順序隊列,q.put((1,‘11‘))#優先順序隊列添加的參數是一個元組,元組元素為優先q.put((2,‘22‘))q.put((3,‘33‘))q.put((4,‘44‘))print(q.get())
二. 線程池
import timefrom concurrent.futures import ThreadPoolExecutordef func(num): time.sleep(0.5) print(num) return num*num #將num*num返回給方法調用者,也就是submit,用t_r接收t = ThreadPoolExecutor(5) #多線程最大設定數量應該為os.cpu_count()的五倍,盡量不要多lst = []for i in range(10): t_r = t.submit(func,i) #提交任務,參數 :第一次參數為要執行的任務,第二個參數為給任務傳的參數和進程池不同的是線程池參數傳遞不需要在寫(args= ),直接寫參數就好 lst.append(t_r) #將任務返回的結果添加到一個列表中t.shutdown() #相當於進程的close + join 等待子線程執行完再執行主線程print(‘主線程‘)[print(i.result()) for i in lst] #對列表進行迴圈,用result()方法取出,取出的是計算後的結果,並且順序和for迴圈相同
################################map方法##############################
import timefrom concurrent.futures import ThreadPoolExecutordef func(num): time.sleep(0.5) print(num) return num*num
t = ThreadPoolExecutor(5)t.map(func,range(20))#拿不到傳回值,拿到的是產生器. 提交多個任務,相當於for+submit()t.shutdown()print(‘主線程‘)
##########################回呼函數############################
將普通函數的傳回值自動傳給回呼函數處理
def func(num): time.sleep(0.5) print(num) return num*numdef call_back(n): print(‘回呼函數 : ‘,n.result())t = ThreadPoolExecutor(5)lst = []for i in range(10): t.submit(func,i).add_done_callback(call_back)#建立回呼函數,和進程的建立不同
python 線程隊列,線程池