什么是进程池_进程池的实现
今天學習了JIR、進程池和線程池
GIL:Global Interpreter Lock
全局解釋器鎖
鎖的作用:為了避免資源競爭造成數據錯亂
python程序的執行過程
1.啟動解釋器進程 python.exe
2.解析你的py文件并執行它
每個py程序中毆斗必須有解釋器參與 解釋器其實就是一堆代碼
相當于多個線程要調用同一個解釋器代碼 共享意味著競爭 競爭就要出事
給解釋器加互斥鎖
python中內存管理依賴于 GC(一段用于回收內存的代碼) 也需要一個線程
除了你自己開的線程 系統還有一些內置線程 就算你的代碼不會去競爭解釋器 內置線程也可能會競爭
所以必須加上鎖
當一個線程遇到了I/O 同時解釋器也會自動解鎖 去執行其他線程 cpu會切換到其他程序
解釋器加鎖以后
將導致所有線程只能并發 不能達到真正的并行 意味著同一時間只有一個CPU在處理你的線程給你的感覺是效率低
代碼執行有兩種狀態
阻塞 i/o 失去CPU的執行權 (CPU等待IO完成)
非阻塞 代碼正常執行 比如循環一千萬次 中途CPU可能切換 很快會回來 (CPU在計算)
假如有32核CPU 要處理一個下載任務 網絡速度慢 只有100kb/s 文件大小為1024kb
如果你的代碼中IO操作非常多 cpu性能不能直接決定你的任務處理速度
在IO密集的程序中 CPU性能無法直接決定程序的執行速度 python就應該干這種活兒
在計算密集的程序中 CPU性能可以直接決定程序的執行速度
計算密集測試
from multiprocessing import Process
import time
#計算密集任務
def task1():
sum = 1
for i in range(10000000):
sum *=i
def task2():
sum = 1
for i in range(10000000):
sum *=i
def task3():
sum = 1
for i in range(10000000):
sum *=i
def task4():
sum = 1
for i in range(10000000):
sum *=i
def task5():
sum = 1
for i in range(10000000):
sum *=i
def task6():
sum = 1
for i in range(10000000):
sum *=i
if __name__ == '__init__':
# 開始時間
st_time = time.time()
# 多進程情況下
p1 = Process(target = task1)
p2 = Process(target = task2)
p3 = Process(target = task3)
p4 = Process(target = task4)
p5 = Process(target = task5)
p6 = Process(target = task6)
p1.start()
p2.start()
p3.start()
p4.start()
p5.start()
p6.start()
p1.join()
p2.join()
p3.join()
p4.join()
p5.join()
p6.join()
print(time.time()-st_time)
'''
1.05321354643464
'''
IO密集測試
from threading import Thread
import time
#計算密集任務
def task1():
time.sleep(3)
def task2():
time.sleep(3)
def task3():
time.sleep(3)
def task4():
time.sleep(3)
def task5():
time.sleep(3)
def task6():
time.sleep(3)
if __name__ == '__main__':
#開始時間
st_time = time.time()
#多線程情況下
t1 = Thread(target = task1)
t2 = Thread(target = task2)
t3 = Thread(target = task3)
t4 = Thread(target = task4)
t5 = Thread(target = task5)
t6 = Thread(target = task6)
t1.start()
t2.start()
t3.start()
t4.start()
t5.start()
t6.start()
t1.join()
t2.join()
t3.join()
t4.join()
t5.join()
t6.join()
print(time.time - st_time)
'''
3.0035946873164
'''
二、進程池
進程池就是一個裝進程的容器
為什么出現
當進程很多的時候方便管理進程
什么時候用?
當并發量特別大的時候 例如雙十一
很多時候進程是空閑的 就讓他進入進程池 讓有任務處理時才從進程池取出來使用
進程池使用
ProcessPoolExecutor類
創建時指定最大進程數 自動創建進程
調用submit函數將任務提交到進程池中
創建進程是在調用submit后發生的
總結一下:
進程池可以自動創建進程
進程限制最大進程數
自動選擇一個空閑的進程幫你處理任務
三、線程池
和進程池差不多,使用的是ThreadPoolExcecutor類
總結
以上是生活随笔為你收集整理的什么是进程池_进程池的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos系统swap设置 查看swa
- 下一篇: 如何通俗理解拉格朗日对偶问题(part1