如果我們有多少個任務就開啟多少個程序,實際上是很浪費資源的。由於我們計算機的cpu個數是有限的,
所以我們起的程序數量時完全和cpu個數相關。
程序池的概念:魚池是放魚的,水池是放水的,獎金池是放獎金的,顧名思義程序池就是放程序的。
我們想象,先建立叫程序池容器,然後製作四個程序放到這個程序池裡,當有任務需要程序去處理的時候,
從程序池中調動乙個程序去幹活,幹完活了程序再回到程序池中,因此我們節省了反覆建立程序所消耗的時間和資源
from multiprocessing import pool #匯入池子模組 使用程序池開程序是不需要process的
import
os,time
deffunc(i):
time.sleep(0.1)
(i,os.getpid())
if__name__ == '
__main__':
p = pool(4) # 例項化乙個4程序的程序池
for i in range(10):
非同步的提交任務
p.close() #
關閉池子,這裡不是**池子中的程序,而是阻止繼續提交任務
p.join() #
阻塞,直到池子中的任務都執行完畢
"""執行結果:
0 14928
1 12132
2 14976
3 15084
4 14928 # 每四個一重複,說明一共有四個程序在工作
5 12132
6 14976
7 15084
8 14928
9 12132
"""
程序池會比普通的多程序節省效率,開啟池是乙個合理的且相對高效操作。當然程序池中的程序數要結合執行電腦的效能及及程式情況綜合考慮,絕對不是越多越好。一般我們開啟cpu個數或者cpu個數加1。
不是所有的情況都適合使用多程序來解決,比如群聊,起多程序是很消耗資源的。一般高計算的程式適合使用多程序。
起多程序的意義:
1·為了更好的利用cpu,所以如果我們的程式中都是網路i/o或者是檔案i/o,就不適合起多程序。
2·起多程序是為了資料的隔離,如果程式中總是要用到資料共享,那麼就不適合使用多程序。
3·超過了cpu個數的任務數,都應該使用程序池來解決問題,而不是無限的開啟子程序。
程序池的其他機制:
使用map簡化**
if__name__ == '
__main__':
p = pool(4)
p.map(func,range(10))
"""等同於:
if __name__ == '__main__':
p = pool(4)
for i in range(10):
p.close() # 關閉池子,這裡不是**池子中的程序,而是阻止繼續提交任務
p.join() # 阻塞,直到池子中的任務都執行完畢
"""
非同步提交任務是可以有返回值的,如果func有返回值,那麼ret.get()是可以獲取函式返回值的
print(ret.get())
同樣的使用p.map()也是可以拿到返回值的
ret = p.map(func,range(10))for r in
ret:
print(r)
Python網編 守護程序
假如我有500臺機器,跑著500個程序,假如有一部分台機器掛了,我們怎麼能及時的知道呢?我們維護自己的機器當然要及時的直到啦 so 如果我們有乙個監控的軟體來實時的監控是不是就可以解決這個問題啦 其原理是 client端每隔乙個時間段 比如60秒 匯報給server端 沒有在正確的時間收到某台機器的...
Python網編 程序間的資料共享
manager提供了很多資料共享機制,但是對於一些基礎資料型別來說,是資料不安全的,那麼q 如何解決呢?a 需要我們自己手動加鎖from multiprocessing import manager,process,lock process開子程序用,lock資料加鎖用,manager程序間資料共享...
Python網編 程序之互斥鎖 lock
我們千方百計實現了程式的非同步,讓多個任務可以同時在幾個程序中併發處理,他們之間的執行沒有順序,一旦開啟也不受我們控制。儘管併發程式設計讓我們能更加充分的利用io資源,但是也給我們帶來了新的問題。當多個程序使用同乙份資料資源的時候,就會引發資料安全或順序混亂問題。import osimport ti...