1、進程池的作用 進程池來控制進程數目,比如httpd的進程模式,規定最小進程數和最大進程數 2、創建進程池的類Pool 如果指定numprocess為3,則進程池會從無到有創建三個進程,然後自始至終使用這三個進程去執行所有任務,不會開啟其他進程 Pool([numprocess [,initial ...
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