Python进程multiprocessing. Process()的使用
1.進程概念
進程是資源分配的最小單位,程序隔離的邊界。
CPU的時間片輪轉,在不同的時間段切換執行不同的進程,但是切換進程是比較耗時的;就引來了輕量級進程,也就是所謂的線程,一個進程中包括多個線程(代碼流,其實也就是進程中同時跑的多個方法體)
- 程序:例如xxx.py這是程序,是一個靜態的
- 進程:一個程序運行起來后,代碼+用到的資源 稱之為進程,它是操作系統分配資源的基本單元。
2.進程的狀態
工作中,任務數往往大于cpu的核數,即一定有一些任務正在執行,而另外一些任務在等待cpu進行執行,因此導致了有了不同的狀態
- 就緒態:運行的條件都已經滿足,正在等在cpu執行
- 執行態:cpu正在執行其功能
- 等待態:等待某些條件滿足,例如一個程序sleep了,此時就處于等待態
3.進程的創建-multiprocessing
multiprocessing模塊就是跨平臺版本的多進程模塊,提供了一個Process類來代表一個進程對象,這個對象可以理解為是一個獨立的進程,可以執行另外的事情。
方法說明:
創建子進程跟創建線程十分類似,只需要傳入一個執行函數和函數的參數,創建一個Process實例,用start()方法啟動。
Process語法結構如下: Process([group [, target [, name [, args [, kwargs]]]]])
- target:如果傳遞了函數的引用,這個子進程就執行這里(函數)的代碼
- args:給target指定的函數傳遞的參數,以元組的方式傳遞
- kwargs:給target指定的函數傳遞命名參數
- name:給進程設定一個名字,可以不設定 group:指定進程組,大多數情況下用不到
Process創建的實例對象的常用方法:
- start():啟動子進程實例(創建子進程)
- is_alive():判斷進程子進程是否還在活著
- join([timeout]):是否等待子進程執行結束,或等待多少秒
- terminate():不管任務是否完成,立即終止子進程
Process創建的實例對象的常用屬性:
- name:當前進程的別名,默認為Process-N,N為從1開始遞增的整數
- pid:當前進程的pid(進程號)
代碼示例:
import multiprocessing import timedef work1():for i in range(10):print("work1----", i)time.sleep(0.5)if __name__ == '__main__':# 創建進程# 1. 導入 multiprocessing 模塊# 2. multiprocessing.Process() 創建子進程# 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()
獲取父id: getppid() 獲取父進程id
6.子進程參數傳遞
給子進程傳遞參數方法和給子線程傳遞參數方法基本一致!
7.進程間不共享全局變量
import multiprocessing # 定義全局變量 num = 100# 定義work方法,設置num1的值 def work():global num # 在函數內部聲明使用全局變量numnum = num + 1 # 對num值進行+1print("work num = %d" % num)# 定義work2方法,獲取num1的值 def work2():print("work2 num = %d" % num)if __name__ == '__main__':# 創建子進程process1 = multiprocessing.Process(group=None, target=work, name="MyProcess")process1.start()# 創建第二個子進程process2 = multiprocessing.Process(group=None, target=work2, name="MyProcess2")process2.start()運行結果:
work num = 101
work2 num = 100
由運行結果可以看出,work函數對num1的修改,在work2中并沒有獲取到,而還是原來的100,所以,進程之間是不能夠共享變量的
8.守護主進程
import multiprocessing import timedef sub_process():for i in range(10):print("子進程運行中", i)time.sleep(0.5)if __name__ == '__main__':# 創建子進程p1 = multiprocessing.Process(group=None, target=sub_process, name="p1")# 設置守護主進程# 第一種方式:# p1.daemon = True# 第二種方式(最好在退出exit()前一句使用):# p1.terminate()# 啟動p1.start()time.sleep(2)print("OVER!")p1.terminate()exit()總結
以上是生活随笔為你收集整理的Python进程multiprocessing. Process()的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux中sz和rz的使用,在服务器和
- 下一篇: python中的线程threading.