本文來自於千鋒教育在阿里雲開發者社區學習中心上線課程《Python入門2020最新大課》,主講人姜偉。
多進程的使用
進程
程序:例如xxx.py這是程序,是一個靜態的。
進程:一個程序運行起來後,代碼+用到的資源 稱之為進程,它是操作系統分配資源的基本單元。
不僅可以通過線程完成多任務,進程也是可以的。
進程的狀態
工作中,任務數往往大於cpu的核數,即一定有一些任務正在執行,而另外一些任務在等待cpu進行執行,因此導致了有了不同的狀態。
- 就緒態:運行的條件都已經滿足,正在等在cpu執行。
- 執行態:cpu正在執行其功能。
- 等待態:等待某些條件滿足,例如一個程序sleep了,此時就處於等待態。
創建進程
multiprocessing模塊就是跨平臺版本的多進程模塊,提供了一個Process類來代表一個進程對象,這個對象可以理解為是一個獨立的進程,可以執行另外的事情。
創建子進程時,只需要傳入一個執行函數和函數的參數,創建一個Process實例,用start()方法啟動。
import multiprocessing, time, os
def dance(n):
for i in range(n):
time.sleep(0.5)
print('正在跳舞{},pid={}'.format(i, os.getpid()))
def sing(m):
for i in range(m):
time.sleep(0.5)
print('正在唱歌{},pid={}'.format(i, os.getpid()))
if __name__ == '__main__':
print('主進程的pid={}'.format(os.getpid()))
# 創建了兩個進程
# target 用來表示執行的任務
# args 用來傳參,類型是一個元組
p1 = multiprocessing.Process(target=dance, args=(100,))
p2 = multiprocessing.Process(target=sing, args=(100,))
p1.start()
p2.start()
方法說明
Process( target [, name [, args [, kwargs]]])
- target:如果傳遞了函數的引用,可以任務這個子進程就執行這裡的代碼
- args:給target指定的函數傳遞的參數,以元組的方式傳遞
- kwargs:給target指定的函數傳遞命名參數
- name:給進程設定一個名字,可以不設定
Process創建的實例對象的常用方法:
- start():啟動子進程實例(創建子進程)
- is_alive():判斷進程子進程是否還在活著
- join([timeout]):是否等待子進程執行結束,或等待多少秒
- terminate():不管任務是否完成,立即終止子進程
Process創建的實例對象的常用屬性:
- name:當前進程的別名,默認為Process-N,N為從1開始遞增的整數
- pid:當前進程的pid(進程號)