日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python进阶之多进程

發布時間:2025/3/8 python 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?td

1.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?mp

2.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?mp

3.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?td

3.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?mp

4.2 定義被調函數

def?job(x):return?x*x

4.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进阶之多进程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。