標籤:第一個字元 線程 submit 產生器 fun ext 類型 func lifo
隊列 (同一個進程內的隊列 , 多線程)
import queue queue.Queue() 先進先出 queue.lifoQueue() 後進先出 queue.PriorityQueue() 優先順序隊列
q = queue.PriorityQueue()
q.put() 接收的是一個元組
元組中的第一個參數是 : 表示當前資料的優先順序
元組中的第二個參數是 : 需要存放到隊列中的資料
優先順序的比較(表示優先順序的類型必須是一致的)
如果都是int,比數值的大小,優先選出數值較小的
如果都是str ,比較字串的大小,(從第一個字串的ASCAII碼開始比較)優先選出ASCAII碼中靠前的.
線程池
存放固定數量的線程,這些線程等待任務,一旦有任務,就線程自動執行任務.
線程的最佳數量 max_workers = (os.CPU_count() or 1) * 5
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor #線程非同步和進程非同步#concurrent.futures 這個模組是非同步呼叫機制#from multiprocessing import Pool 這個模組既可以非同步也可以同步,def func (num) : sum = 0 for i in range(num) : sum += i**2 print(sum)if __name__ == ‘__main__‘: p = ThreadPoolExecutor(10) for n in range(100): #p.submit(func , args=(n,)) p.submit(func , n)#提交任務 p.shutdown()#等效於進程池中的close+join 是指讓父線程等待池中所有進程執行完所有任務
如何把多個任務放入線程池
for + submit 的方式提交多個任務
map(func , iterable)方式去提交多個任務
通過進程池線程池的效率比較
不管是Pool 的進程池還是ProcessPoolExecutor() 的進程池,執行效率相當
ThreadPoolExecutor 的效率要差很多
所以當計算密集時,使用多進程.
線程傳回值
用for + submit 方式提交多個任務,用result方法拿結果
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor #線程非同步和進程非同步#concurrent.futures 這個模組是非同步呼叫機制#from multiprocessing import Pool 這個模組既可以非同步也可以同步,def func (num) : sum = 0 for i in range(num) : sum += i**2 return sumif __name__ == ‘__main__‘: p = ThreadPoolExecutor(10) re = [] for n in range(100): #p.submit(func , args=(n,)) r = p.submit(func , n)#提交任務 re.append(r) #p.shutdown()#等效於進程池中的close+join 是指讓父線程等待池中所有進程執行完所有任務 [print(i.result()) for i in re ]#在pool 進程中那結果,用get方法 , 在ThreadPoolExecutor中拿結果使用result方法
用map的方式提交多個任務, 返回的是產生器對象,用__next__() 方法拿結果
回呼函數
隊列與線程補充