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