python进阶之多进程
python進階之多進程
0.導語1.進程與線程初識1.1 導包1.2 定義被調函數1.3 創建線程和進程1.4 啟動線程和進程2.輸出結果存放至Queue2.1 導包2.2 定義被調函數2.3 啟動多進程,存放結果3.進程與線程效率對比3.1 導入多進程包3.2 定義被調函數3.3 封裝多進程3.4 導入線程包3.5 封裝多線程3.6 封裝普通方法3.7 主函數調用3.8 輸出結果4.進程池4.1 導入進程包4.2 定義被調函數4.3 封裝函數4.4 主函數調用5.共享內存6.進程鎖6.1 不同進程爭奪資源6.2 通過鎖機制解決爭奪資源問題7.參考資料
0.導語
今天來學習python進階知識,一起來實戰嗨起來~
歡迎留言,哈哈,我會對經常留言的后面發福利!
1.進程與線程初識
1.1 導包
#?導入線程進程標準模塊 import?multiprocessing?as?mp import?threading?as?td1.2 定義被調函數
#?定義一個被線程和進程調用的函數 def?job(a,d):print('aaaaa')1.3 創建線程和進程
#?創建線程和進程 t1?=?td.Thread(target=job,?args=(1,2))?#?(1,2,)與(1,2)一樣效果 p1?=?mp.Process(target=job,?args=(1,2))?#?(1,2,)與(1,2)一樣效果1.4 啟動線程和進程
if?__name__?==?'__main__':#?啟動線程和進程t1.start()p1.start()#?連接線程和進程t1.join()p1.join()2.輸出結果存放至Queue
2.1 導包
import?multiprocessing?as?mp2.2 定義被調函數
這里傳入Queue對象
def?job(q):res?=?0for?i?in?range(1000000):res?+=?i?+?i?**?2?+?i?**?3q.put(res)2.3 啟動多進程,存放結果
if?__name__?==?'__main__':q?=?mp.Queue()p1?=?mp.Process(target=job,?args=(q,))p2?=?mp.Process(target=job,?args=(q,))p1.start()p2.start()p1.join()p2.join()res1?=?q.get()res2?=?q.get()print(res1+res2)3.進程與線程效率對比
3.1 導入多進程包
import?multiprocessing?as?mp3.2 定義被調函數
def?job(q):res?=?0for?i?in?range(1000000):res?+=?i?+?i?**?2?+?i?**?3q.put(res)3.3 封裝多進程
#?多核/多進程 def?multicore():q?=?mp.Queue()p1?=?mp.Process(target=job,?args=(q,))p2?=?mp.Process(target=job,?args=(q,))p1.start()p2.start()p1.join()p2.join()res1?=?q.get()res2?=?q.get()print('multicore:',?res1?+?res2)3.4 導入線程包
import?threading?as?td3.5 封裝多線程
#?多線程 def?multithread():q?=?mp.Queue()t1?=?td.Thread(target=job,?args=(q,))t2?=?td.Thread(target=job,?args=(q,))t1.start()t2.start()t1.join()t2.join()res1?=?q.get()res2?=?q.get()print('multithread:',?res1?+?res2)3.6 封裝普通方法
def?normal():res?=?0for?_?in?range(2):for?i?in?range(1000000):res?+=?i?+?i?**?2?+?i?**?3print('normal:',res)3.7 主函數調用
三種方法對比效率
import?time if?__name__?==?'__main__':st?=?time.time()normal()st1?=?time.time()print('normal?time:',?st1?-?st)multithread()st2?=?time.time()print('multithread?time:',?st2?-?st1)multicore()st3?=?time.time()print('multicore?time:',?st3?-?st2)3.8 輸出結果
normal:?499999666667166666000000 normal?time:?1.779979944229126 multithread:?499999666667166666000000 multithread?time:?1.8090195655822754 multicore:?499999666667166666000000 multicore?time:?1.2929792404174805結論:多進程 < 普通 < 多線程
4.進程池
說在前面:有了池子之后,就可以讓池子對應某一個函數,我們向池子里丟數據,池子就會返回函數返回的值。
Pool和之前的Process的不同點是丟向Pool的函數有返回值,而Process的沒有返回值。
4.1 導入進程包
import?multiprocessing?as?mp4.2 定義被調函數
def?job(x):return?x*x4.3 封裝函數
map() 與 apply_async() 兩種方式 返回結果
def?multicore():'''Pool默認調用是CPU的核數,傳入processes可自定義CPU核數map()放入迭代參數,返回多個結果apply_async()只能放入一組參數,并返回一個結果,如果想得到map()的效果需要通過迭代'''pool?=?mp.Pool(processes=2)res?=?pool.map(job,?range(10))print(res)'''apply_async()只能傳遞一個值,它只會放入一個核進行運算,傳入的值因為必須是可迭代的,所以在傳入值后需要加逗號,同時需要用get()方法獲取返回值。'''res?=?pool.apply_async(job,?(2,))multi_res?=?[pool.apply_async(job,?(i,))?for?i?in?range(10)]print(res.get())?#?獲取單個結果print([res.get()?for?res?in?multi_res])?#?獲取多個結果4.4 主函數調用
if?__name__?==?'__main__':multicore()5.共享內存
import?multiprocessing?as?mp''' 使用Value數據存儲在一個共享的內存表中 d表示一個雙精浮點類型,i表示一個帶符號的整型 ''' value1?=?mp.Value('i',?0) value2?=?mp.Value('d',?3.14)''' Array類,可以和共享內存交互,來實現在進程之間共享數據。 這里的Array和numpy中的不同,它只能是一維的,不能是多維的。 同樣和Value?一樣,需要定義數據形式,否則會報錯。 ''' array?=?mp.Array('i',?[1,2,3,4])6.進程鎖
6.1 不同進程爭奪資源
import?multiprocessing?as?mp import?time def?job(v,?num):for?_?in?range(5):time.sleep(0.1)v.value?+=?numprint(v.value,end="\n")def?multicore():v?=?mp.Value('i',0)?#?定義共享變量p1?=?mp.Process(target=job,?args=(v,1))p2?=?mp.Process(target=job,?args=(v,3))?#?設定不同的number看如何搶奪內存p1.start()p2.start()p1.join()p2.join()if?__name__?==?'__main__':multicore()6.2 通過鎖機制解決爭奪資源問題
import?multiprocessing?as?mp import?time def?job(v,?num,?l):l.acquire()?#?鎖住for?_?in?range(5):time.sleep(0.1)v.value?+=?numprint(v.value,end="\n")l.release()?#?釋放def?multicore():l?=?mp.Lock()?#?定義一個進程鎖v?=?mp.Value('i',0)?#?定義共享變量p1?=?mp.Process(target=job,?args=(v,1,l))?#?需要將lock傳入p2?=?mp.Process(target=job,?args=(v,3,l))?#?設定不同的number看如何搶奪內存p1.start()p2.start()p1.join()p2.join()if?__name__?==?'__main__':multicore()7.參考資料
https://morvanzhou.github.io/tutorials/python-basic/multiprocessing/
作者光城的公眾號:
請關注和分享↓↓↓?
機器學習初學者
QQ群:774999266
往期精彩回顧
良心推薦:機器學習入門資料匯總及學習建議(2018版)
黃海廣博士的github鏡像下載(機器學習及深度學習資源)
吳恩達老師的機器學習和深度學習課程筆記打印版
機器學習小抄-(像背托福單詞一樣理解機器學習)
首發:深度學習入門寶典-《python深度學習》原文代碼中文注釋版及電子書
科研工作者的神器-zotero論文管理工具
機器學習的數學基礎
機器學習必備寶典-《統計學習方法》的python代碼實現、電子書及課件
吐血推薦收藏的學位論文排版教程(完整版)
總結
以上是生活随笔為你收集整理的python进阶之多进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 适合初学者快速入门的Numpy实战全集
- 下一篇: websocket python爬虫_p