Python進程multiprocessing.Process()的使用解讀
1.進程概念
進程是資源分配的最小單位,程序隔離的邊界。

CPU的時間片輪轉(zhuǎn),在不同的時間段切換執(zhí)行不同的進程,但是切換進程是比較耗時的;就引來了輕量級進程,也就是所謂的線程,一個進程中包括多個線程(代碼流,其實也就是進程中同時跑的多個方法體)
- 程序:例如xxx.py這是程序,是一個靜態(tài)的
- 進程:一個程序運行起來后,代碼+用到的資源 稱之為進程,它是操作系統(tǒng)分配資源的基本單元。
2.進程的狀態(tài)
工作中,任務(wù)數(shù)往往大于cpu的核數(shù),即一定有一些任務(wù)正在執(zhí)行,而另外一些任務(wù)在等待cpu進行執(zhí)行,因此導致了有了不同的狀態(tài)

- 就緒態(tài):運行的條件都已經(jīng)滿足,正在等在cpu執(zhí)行
- 執(zhí)行態(tài):cpu正在執(zhí)行其功能
- 等待態(tài):等待某些條件滿足,例如一個程序sleep了,此時就處于等待態(tài)
3.進程的創(chuàng)建-multiprocessing
multiprocessing模塊就是跨平臺版本的多進程模塊,提供了一個Process類來代表一個進程對象,這個對象可以理解為是一個獨立的進程,可以執(zhí)行另外的事情。
方法說明:
創(chuàng)建子進程跟創(chuàng)建線程十分類似,只需要傳入一個執(zhí)行函數(shù)和函數(shù)的參數(shù),創(chuàng)建一個Process實例,用start()方法啟動。
Process語法結(jié)構(gòu)如下: Process([group [, target [, name [, args [, kwargs]]]]])
- target:如果傳遞了函數(shù)的引用,這個子進程就執(zhí)行這里(函數(shù))的代碼
- args:給target指定的函數(shù)傳遞的參數(shù),以元組的方式傳遞
- kwargs:給target指定的函數(shù)傳遞命名參數(shù)
- name:給進程設(shè)定一個名字,可以不設(shè)定 group:指定進程組,大多數(shù)情況下用不到
Process創(chuàng)建的實例對象的常用方法:
- start():啟動子進程實例(創(chuàng)建子進程)
- is_alive():判斷進程子進程是否還在活著
- join([timeout]):是否等待子進程執(zhí)行結(jié)束,或等待多少秒
- terminate():不管任務(wù)是否完成,立即終止子進程
Process創(chuàng)建的實例對象的常用屬性:
- name:當前進程的別名,默認為Process-N,N為從1開始遞增的整數(shù)
- pid:當前進程的pid(進程號)
代碼示例:
import multiprocessing
import time
def work1():
for i in range(10):
print("work1----", i)
time.sleep(0.5)
if __name__ == '__main__':
# 創(chuàng)建進程
# 1. 導入 multiprocessing 模塊
# 2. multiprocessing.Process() 創(chuàng)建子進程
# 3. start() 方法啟動進程
p1 = multiprocessing.Process(group=None, target=work1)
p1.start()
for i in range(10):
print("這是主進程", i)
time.sleep(0.5)

4.進程名稱獲取
multiprocessing.current_process()

5. 獲取進程pid
有兩種方法可以獲取
1)multiprocessing.current_process().pid
2)使用import os模塊的getpid()
import multiprocessing
import time
import os
def work():
# 獲取進程的名稱
print(multiprocessing.current_process())
# 獲取進程的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__':
# 獲取進程的pid
print(multiprocessing.current_process())
# 創(chuàng)建子進程
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() 獲取父進程id

6.子進程參數(shù)傳遞
給子進程傳遞參數(shù)方法和給子線程傳遞參數(shù)方法基本一致!

7.進程間不共享全局變量
import multiprocessing
# 定義全局變量
num = 100
# 定義work方法,設(shè)置num1的值
def work():
global num # 在函數(shù)內(nèi)部聲明使用全局變量num
num = num + 1 # 對num值進行+1
print("work num = %d" % num)
# 定義work2方法,獲取num1的值
def work2():
print("work2 num = %d" % num)
if __name__ == '__main__':
# 創(chuàng)建子進程
process1 = multiprocessing.Process(group=None, target=work, name="MyProcess")
process1.start()
# 創(chuàng)建第二個子進程
process2 = multiprocessing.Process(group=None, target=work2, name="MyProcess2")
process2.start()
運行結(jié)果:
work num = 101
work2 num = 100
由運行結(jié)果可以看出,work函數(shù)對num1的修改,在work2中并沒有獲取到,而還是原來的100,所以,進程之間是不能夠共享變量的

8.守護主進程
import multiprocessing
import time
def sub_process():
for i in range(10):
print("子進程運行中", i)
time.sleep(0.5)
if __name__ == '__main__':
# 創(chuàng)建子進程
p1 = multiprocessing.Process(group=None, target=sub_process, name="p1")
# 設(shè)置守護主進程
# 第一種方式:
# p1.daemon = True
# 第二種方式(最好在退出exit()前一句使用):
# p1.terminate()
# 啟動
p1.start()
time.sleep(2)
print("OVER!")
p1.terminate()
exit()
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章
教你如何用pycharm安裝pyqt5及其相關(guān)配置
這篇文章主要介紹了教你如何用pycharm安裝pyqt5及其相關(guān)配置,首先通過單獨創(chuàng)建一個文件夾來專門存放pyqt5的代碼并建立虛擬環(huán)境展開文章敘述,需要的小伙伴可以參考一下2022-04-04
Python實戰(zhàn)基礎(chǔ)之Pandas統(tǒng)計某個數(shù)據(jù)列的空值個數(shù)
我們在處理數(shù)據(jù)的時候,經(jīng)常需要檢查數(shù)據(jù)的質(zhì)量,也需要知道出問題的數(shù)據(jù)在哪個位置,下面這篇文章主要給大家介紹了關(guān)于Python實戰(zhàn)基礎(chǔ)之利用Pandas統(tǒng)計某個數(shù)據(jù)列空值個數(shù)的相關(guān)資料,需要的朋友可以參考下2022-08-08
全面解析Python的While循環(huán)語句的使用方法
這篇文章主要介紹了全面解析Python的While循環(huán)語句的使用方法,是Python入門學習中的基礎(chǔ)知識,需要的朋友可以參考下2015-10-10
基于Python的A*算法解決八數(shù)碼問題實現(xiàn)步驟
這篇文章主要給大家介紹了關(guān)于如何基于Python的A*算法解決八數(shù)碼問題的實現(xiàn)步驟,文中介紹了八數(shù)碼問題及其求解方法,通過啟發(fā)式搜索算法,特別是A*算法,可以有效地解決八數(shù)碼問題,,需要的朋友可以參考下2024-11-11

