Python進(jìn)程multiprocessing.Process()的使用解讀
1.進(jìn)程概念
進(jìn)程是資源分配的最小單位,程序隔離的邊界。
CPU的時(shí)間片輪轉(zhuǎn),在不同的時(shí)間段切換執(zhí)行不同的進(jìn)程,但是切換進(jìn)程是比較耗時(shí)的;就引來(lái)了輕量級(jí)進(jìn)程,也就是所謂的線程,一個(gè)進(jìn)程中包括多個(gè)線程(代碼流,其實(shí)也就是進(jìn)程中同時(shí)跑的多個(gè)方法體)
- 程序:例如xxx.py這是程序,是一個(gè)靜態(tài)的
- 進(jìn)程:一個(gè)程序運(yùn)行起來(lái)后,代碼+用到的資源 稱之為進(jìn)程,它是操作系統(tǒng)分配資源的基本單元。
2.進(jìn)程的狀態(tài)
工作中,任務(wù)數(shù)往往大于cpu的核數(shù),即一定有一些任務(wù)正在執(zhí)行,而另外一些任務(wù)在等待cpu進(jìn)行執(zhí)行,因此導(dǎo)致了有了不同的狀態(tài)
- 就緒態(tài):運(yùn)行的條件都已經(jīng)滿足,正在等在cpu執(zhí)行
- 執(zhí)行態(tài):cpu正在執(zhí)行其功能
- 等待態(tài):等待某些條件滿足,例如一個(gè)程序sleep了,此時(shí)就處于等待態(tài)
3.進(jìn)程的創(chuàng)建-multiprocessing
multiprocessing模塊就是跨平臺(tái)版本的多進(jìn)程模塊,提供了一個(gè)Process類來(lái)代表一個(gè)進(jìn)程對(duì)象,這個(gè)對(duì)象可以理解為是一個(gè)獨(dú)立的進(jìn)程,可以執(zhí)行另外的事情。
方法說(shuō)明:
創(chuàng)建子進(jìn)程跟創(chuàng)建線程十分類似,只需要傳入一個(gè)執(zhí)行函數(shù)和函數(shù)的參數(shù),創(chuàng)建一個(gè)Process實(shí)例,用start()方法啟動(dòng)。
Process語(yǔ)法結(jié)構(gòu)如下: Process([group [, target [, name [, args [, kwargs]]]]])
- target:如果傳遞了函數(shù)的引用,這個(gè)子進(jìn)程就執(zhí)行這里(函數(shù))的代碼
- args:給target指定的函數(shù)傳遞的參數(shù),以元組的方式傳遞
- kwargs:給target指定的函數(shù)傳遞命名參數(shù)
- name:給進(jìn)程設(shè)定一個(gè)名字,可以不設(shè)定 group:指定進(jìn)程組,大多數(shù)情況下用不到
Process創(chuàng)建的實(shí)例對(duì)象的常用方法:
- start():?jiǎn)?dòng)子進(jìn)程實(shí)例(創(chuàng)建子進(jìn)程)
- is_alive():判斷進(jìn)程子進(jìn)程是否還在活著
- join([timeout]):是否等待子進(jìn)程執(zhí)行結(jié)束,或等待多少秒
- terminate():不管任務(wù)是否完成,立即終止子進(jìn)程
Process創(chuàng)建的實(shí)例對(duì)象的常用屬性:
- name:當(dāng)前進(jìn)程的別名,默認(rèn)為Process-N,N為從1開(kāi)始遞增的整數(shù)
- pid:當(dāng)前進(jìn)程的pid(進(jìn)程號(hào))
代碼示例:
import multiprocessing import time def work1(): for i in range(10): print("work1----", i) time.sleep(0.5) if __name__ == '__main__': # 創(chuàng)建進(jìn)程 # 1. 導(dǎo)入 multiprocessing 模塊 # 2. multiprocessing.Process() 創(chuàng)建子進(jìn)程 # 3. start() 方法啟動(dòng)進(jìn)程 p1 = multiprocessing.Process(group=None, target=work1) p1.start() for i in range(10): print("這是主進(jìn)程", i) time.sleep(0.5)
4.進(jìn)程名稱獲取
multiprocessing.current_process()
5. 獲取進(jìn)程pid
有兩種方法可以獲取
1)multiprocessing.current_process().pid
2)使用import os模塊的getpid()
import multiprocessing import time import os def work(): # 獲取進(jìn)程的名稱 print(multiprocessing.current_process()) # 獲取進(jìn)程的pid print(multiprocessing.current_process().pid, os.getpid()) i = 0 while i < 10: print("work中執(zhí)行", i) time.sleep(0.5) i = i + 1 if __name__ == '__main__': # 獲取進(jìn)程的pid print(multiprocessing.current_process()) # 創(chuàng)建子進(jìn)程 process1 = multiprocessing.Process(group=None, target=work) process1.start() i = 0 while i < 10: print("我在主線程中執(zhí)行",i) time.sleep(0.3) i = i + 1
獲取父id: getppid() 獲取父進(jìn)程id
6.子進(jìn)程參數(shù)傳遞
給子進(jìn)程傳遞參數(shù)方法和給子線程傳遞參數(shù)方法基本一致!
7.進(jìn)程間不共享全局變量
import multiprocessing # 定義全局變量 num = 100 # 定義work方法,設(shè)置num1的值 def work(): global num # 在函數(shù)內(nèi)部聲明使用全局變量num num = num + 1 # 對(duì)num值進(jìn)行+1 print("work num = %d" % num) # 定義work2方法,獲取num1的值 def work2(): print("work2 num = %d" % num) if __name__ == '__main__': # 創(chuàng)建子進(jìn)程 process1 = multiprocessing.Process(group=None, target=work, name="MyProcess") process1.start() # 創(chuàng)建第二個(gè)子進(jìn)程 process2 = multiprocessing.Process(group=None, target=work2, name="MyProcess2") process2.start()
運(yùn)行結(jié)果:
work num = 101
work2 num = 100
由運(yùn)行結(jié)果可以看出,work函數(shù)對(duì)num1的修改,在work2中并沒(méi)有獲取到,而還是原來(lái)的100,所以,進(jìn)程之間是不能夠共享變量的
8.守護(hù)主進(jìn)程
import multiprocessing import time def sub_process(): for i in range(10): print("子進(jìn)程運(yùn)行中", i) time.sleep(0.5) if __name__ == '__main__': # 創(chuàng)建子進(jìn)程 p1 = multiprocessing.Process(group=None, target=sub_process, name="p1") # 設(shè)置守護(hù)主進(jìn)程 # 第一種方式: # p1.daemon = True # 第二種方式(最好在退出exit()前一句使用): # p1.terminate() # 啟動(dòng) p1.start() time.sleep(2) print("OVER!") p1.terminate() exit()
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Python使用multiprocessing模塊實(shí)現(xiàn)多進(jìn)程并發(fā)處理大數(shù)據(jù)量的示例代碼
- python使用 multiprocessing 多進(jìn)程處理批量數(shù)據(jù)的示例代碼
- Python?multiprocessing.value實(shí)現(xiàn)多進(jìn)程數(shù)據(jù)共享的示例
- Python multiprocessing 進(jìn)程間通信方式實(shí)現(xiàn)
- python Multiprocessing.Pool進(jìn)程池模塊詳解
- python?包之?multiprocessing?多進(jìn)程
相關(guān)文章
教你如何用pycharm安裝pyqt5及其相關(guān)配置
這篇文章主要介紹了教你如何用pycharm安裝pyqt5及其相關(guān)配置,首先通過(guò)單獨(dú)創(chuàng)建一個(gè)文件夾來(lái)專門存放pyqt5的代碼并建立虛擬環(huán)境展開(kāi)文章敘述,需要的小伙伴可以參考一下2022-04-04python實(shí)現(xiàn)盲盒抽獎(jiǎng)功能(減庫(kù)存)
本文主要介紹了python實(shí)現(xiàn)盲盒抽獎(jiǎng)功能,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Python實(shí)戰(zhàn)基礎(chǔ)之Pandas統(tǒng)計(jì)某個(gè)數(shù)據(jù)列的空值個(gè)數(shù)
我們?cè)谔幚頂?shù)據(jù)的時(shí)候,經(jīng)常需要檢查數(shù)據(jù)的質(zhì)量,也需要知道出問(wèn)題的數(shù)據(jù)在哪個(gè)位置,下面這篇文章主要給大家介紹了關(guān)于Python實(shí)戰(zhàn)基礎(chǔ)之利用Pandas統(tǒng)計(jì)某個(gè)數(shù)據(jù)列空值個(gè)數(shù)的相關(guān)資料,需要的朋友可以參考下2022-08-08Python圖像運(yùn)算之圖像點(diǎn)運(yùn)算與灰度化處理詳解
這篇文章主要介紹了圖像點(diǎn)運(yùn)算的灰度化處理的相關(guān)知識(shí),包括各種灰度算法的實(shí)現(xiàn),以及灰度線性變換和灰度非線性變換。需要的可以參考一下2022-02-02基于Django框架的權(quán)限組件rbac實(shí)例講解
今天小編就為大家分享一篇基于Django框架的權(quán)限組件rbac實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08全面解析Python的While循環(huán)語(yǔ)句的使用方法
這篇文章主要介紹了全面解析Python的While循環(huán)語(yǔ)句的使用方法,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10基于Python的A*算法解決八數(shù)碼問(wèn)題實(shí)現(xiàn)步驟
這篇文章主要給大家介紹了關(guān)于如何基于Python的A*算法解決八數(shù)碼問(wèn)題的實(shí)現(xiàn)步驟,文中介紹了八數(shù)碼問(wèn)題及其求解方法,通過(guò)啟發(fā)式搜索算法,特別是A*算法,可以有效地解決八數(shù)碼問(wèn)題,,需要的朋友可以參考下2024-11-11