程序池與執行緒池
阿新 • • 發佈:2022-01-17
目錄
一:程序池與執行緒池
1.什麼是池?
在保證計算機硬體不奔潰的前提下開設多程序和多執行緒
降低了程式的執行效率但是保證了計算機硬體的安全
2.什麼是用池?
池的功能是限制啟動的程序數或執行緒數。
3.什麼時候應該限制?
當併發的任務數遠遠超過了計算機的承受能力時,即無法一次性開啟過多的程序數或執行緒數時 就應該用池的概念將開啟的程序數或執行緒數限制在計算機可承受的範圍內
4.程序池與執行緒池
程序池:提前開設了固定個數的程序 之後反覆呼叫這些程序完成工作(後續不再開設新的)
執行緒池:提前開設了固定個數的執行緒 之後反覆呼叫這些執行緒完成工作(後續不再開設新的)
- 程序池與執行緒池相結合使用,可以完美解決所缺的問題
5.程序池模組
from concurrent.futures import ProcessPoolExecutor
6.執行緒池模組
from concurrent.futures import ThreadPoolExecutor
二:程序池程式碼實現
ProcessPoolExecutor(1) : 開設程序池去執行 設定程序池大小 submit(函式, 引數) : 把任務提交到程序池執行
import time import os import random from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor # 程序池 執行緒池 def task(n): # 程序id print(os.getpid(), '開始執行了') time.sleep(3) return n * n if __name__ == '__main__': # 開設程序池去執行 設定程序池大小 # ProcesspoolExecutor實列化得到一個物件 # 括號內可以傳數字 不傳的話預設會開設當前計算機cpu個數五倍 pool_p = ProcessPoolExecutor(1) for i in range(10): # 把任務提交到程序池執行 # 函式(n=i) 指定引數 pool_p.submit(task, n=i) print('我是主程序')
2.程序池 進階版
shutdown() : 程序池內,等待所有子程序結束才執行主程序
import time
import os
import random
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# 程序池 執行緒池
def task(n):
# 程序id
print(os.getpid(), '開始執行了')
time.sleep(1)
return n * n
if __name__ == '__main__':
# 開設程序池去執行 設定程序池大小
# ProcesspoolExecutor實列化得到一個物件
pool_p = ProcessPoolExecutor(3)
for i in range(10):
# 把任務提交到程序池執行
# 函式(n=i) 指定引數
pool_p.submit(task, n=i)
# 等待所有子程序執行完成,主程序在執行 預設為True
pool_p.shutdown()
print('我是主程序')
3.程序池 中階版
result() : 獲取執行結果
import time
import os
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# 程序池 執行緒池
def task(n):
# 程序id
print(os.getpid(), '開始執行了')
time.sleep(1)
return n * n
if __name__ == '__main__':
# 開設程序池去執行 設定程序池大小
# ProcesspoolExecutor實列化得到一個物件
pool_p = ProcessPoolExecutor(5)
# 定義空列表
ll = []
for i in range(10):
# 把任務提交到程序池執行
# 函式(n=i) 指定引數
f = pool_p.submit(task, n=i)
# 將返回值新增到列表
ll.append(f)
# 等待所有子程序執行完成,主程序在執行
pool_p.shutdown()
for l in ll:
# 取到當前程序執行任務的返回值
res = l.result()
print(res)
print('我是主程序')
4.程序池 完整版
map取代
import time
import os
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# 程序池 執行緒池
def task(n):
# 程序id
print(os.getpid(), '開始執行了')
time.sleep(1)
return n * n
if __name__ == '__main__':
# 開設程序池去執行 設定程序池大小
# ProcesspoolExecutor實列化得到一個物件
pool_p = ProcessPoolExecutor(3)
# for i in range(10):
# # 把任務提交到程序池執行
# # 函式(n=i) 指定引數
# f = pool_p.submit(task, n=i)
# 等同於上面兩句執行結果
# map取代了for迴圈的,第一個引數是要執行的任務,第二個引數是可迭代物件
# 迭代一次的結果,會傳給任務
pool_p.map(task, range(10))
# 等待所有子程序執行完成,主程序在執行
pool_p.shutdown()
print('我是主程序')
5.程序池 終極版
add_done_callback result回撥
import time
import os
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# 程序池 執行緒池
def task(n):
# 程序id
print(os.getpid(), '開始執行了')
# 執行任務處於就緒態,cpu排程誰就不一定了
time.sleep(1)
return n * n
def callback(result):
print(result.result())
if __name__ == '__main__':
# 開設程序池去執行 設定程序池大小
# ProcesspoolExecutor實列化得到一個物件
pool_p = ProcessPoolExecutor(1)
for i in range(10):
# 當任務執行完成後 會回撥該函式(callback)
pool_p.submit(task, n=i).add_done_callback(callback)
# 等待所有子程序執行完成,主程序在執行
pool_p.shutdown()
print('我是主程序')
- 輸出結果
三:執行緒池 使用
執行緒池與程序池用法模組相同,只更改設定執行緒池模組
import time
import os
import random
from concurrent.futures import ThreadPoolExecutor
# 程序池 執行緒池
def task(n):
# 程序id
print(os.getpid(), '開始執行了')
time.sleep(3)
return n * n
if __name__ == '__main__':
# 開設程序池去執行 設定程序池大小
# ProcesspoolExecutor實列化得到一個物件
# 括號內可以傳數字 不傳的話預設會開設當前計算機cpu個數五倍
pool_p = ThreadPoolExecutor(1)
for i in range(10):
# 把任務提交到程序池執行
# 函式(n=i) 指定引數
pool_p.submit(task, n=i)
print('我是主程序')