1、
2、 為啥要有 行程池和執行緒池
行程池來控制行程數目,比如httpd的行程模式,規定最小行程數和最大行程數
3、創建行程池的類Pool
如果指定numprocess為3,則行程池會從無到有創建三個行程,然后自始至終使用這三個行程去執行所有任務,不會開啟其他行程
Pool([numprocess [,initializer [, initargs]]]):創建行程池
引數介紹:
numprocess:要創建的行程數,如果省略,將默認使用cpu_count()的值
initializer:是每個作業行程啟動時要執行的可呼叫物件,默認為None
initargs:是要傳給initializer的引陣列
方法介紹:
主要方法:p.apply(func [, args [, kwargs]])
在一個池作業行程中執行func(*args,**kwargs),然后回傳結果,
需要強調的是:此操作并不會在所有池作業行程中并執行func函式,如果要通過不同引數并發地執行func函式,必須從不同執行緒呼叫p.apply()函式或者使用p.apply_async()
p.apply_async(func [, args [, kwargs]])
在一個池作業行程中執行func(*args,**kwargs),然后回傳結果,此方法的結果是AsyncResult類的實體,callback是可呼叫物件,接收輸入引數,
當func的結果變為可用時,將理解傳遞給callback,callback禁止執行任何阻塞操作,否則將接收其他異步操作中的結果,p.close()
關閉行程池,防止進一步操作,如果所有操作持續掛起,它們將在作業行程終止前完成
p.jion()
等待所有作業行程退出,此方法只能在close()或 teminate()之后呼叫
4、行程池和執行緒池
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor import time import os # pool = ThreadPoolExecutor(5) # 池子里面固定只有五個執行緒 # 括號內可以傳數字 不傳的話默認會開設當前計算機cpu個數五倍的執行緒 pool = ProcessPoolExecutor(5) # 括號內可以傳數字 不傳的話默認會開設當前計算機cpu個數行程 """ 池子造出來之后 里面會固定存在五個執行緒 這個五個執行緒不會出現重復創建和銷毀的程序 池子造出來之后 里面會固定的幾個行程 這個幾個行程不會出現重復創建和銷毀的程序 池子的使用非常的簡單 你只需要將需要做的任務往池子中提交即可 自動會有人來服務你 """ def task(n): print(n,os.getpid()) time.sleep(2) return n**n def call_back(n): print('call_back>>>:',n.result()) """ 任務的提交方式 同步:提交任務之后原地等待任務的回傳結果 期間不做任何事 異步:提交任務之后不等待任務的回傳結果 執行繼續往下執行 回傳結果如何獲取??? 異步提交任務的回傳結果 應該通過回呼機制來獲取 回呼機制 就相當于給每個異步任務系結了一個定時炸彈 一旦該任務有結果立刻觸發爆炸 """ if __name__ == '__main__': # pool.submit(task, 1) # 朝池子中提交任務 異步提交 # print('主') t_list = [] for i in range(20): # 朝池子中提交20個任務 # res = pool.submit(task, i) # <Future at 0x100f97b38 state=running> res = pool.submit(task, i).add_done_callback(call_back) # print(res.result()) # result方法 同步提交 # t_list.append(res) # 等待執行緒池中所有的任務執行完畢之后再繼續往下執行 # pool.shutdown() # 關閉執行緒池 等待執行緒池中所有的任務運行完畢 # for t in t_list: # print('>>>:',t.result()) # 肯定是有序的 """ 程式有并發變成了串行 任務的為什么列印的是None res.result() 拿到的就是異步提交的任務的回傳結果 """View Code
參考資料:
https://www.cnblogs.com/linhaifeng/articles/7428874.html#_label9
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/152938.html
標籤:Python
