舉例一個吃飯活動,有一碗湯和一碗飯,正常操作是一口飯一口湯(當然你先把湯或者飯一口氣吃完,當我無話可說)。單進程只能是先吃完飯,再喝湯;或者是先喝完湯,再吃飯。
看代碼
import time
def drink():
for i in range(3):
print("喝湯……")
time.sleep(1)
def eat():
for i in range(3):
print("吃飯……")
time.sleep(1)
if __name__ == '__main__':
eat()
drink()
運行結果如下
先喝完了所有湯,再吃完所有飯,顯然這種結果不是我們想要的
1、導入進程包
import multiprocessing
2、通過進程類創建進程對象
進程對象 = multiprocessing.Process(target=*)
此處target的值可以是函數名稱
3、啟動進程執行任務
進程對象.start()
看代碼示例
import multiprocessing
import time
def drink():
for i in range(3):
print("喝湯……")
time.sleep(1)
def eat():
for i in range(3):
print("吃飯……")
time.sleep(1)
if __name__ == '__main__':
#target:指定函數名
drink_process = multiprocessing.Process(target=drink)
eat_process = multiprocessing.Process(target=eat)
drink_process.start()
eat_process.start()
運行結果
可以看到喝湯和吃飯交叉進行
這地方用到的是args和kwargs,其中args是使用元素組的方式給指定任務傳參,kwargs是使用字典方式給指定任務傳參。
args使用方式
進程對象 = multiprocessing.Process(target=*,args=(*,))
此處注意,若只有一個元素,那個逗號也是不可以省略的。
kwargs使用方式
進程對象 = multiprocessing.Process(target=*,kwargs={"變量名": 變量值})
還是以上面吃飯喝湯為例子寫代碼
import time
import multiprocessing
def eat(num,name):
for i in range(num):
print(name+"吃一口……")
time.sleep(1)
def drink(num,name):
for i in range(num):
print(name+"喝一口……")
time.sleep(1)
if __name__ == '__main__':
# target:指定執行的函數名
# args:使用元組方式給指定任務傳參
# kwargs:使用字典方式給指定任務傳參
eat_process = multiprocessing.Process(target=eat,args=(3,"giao"))
drink_process = multiprocessing.Process(target=drink,kwargs={"num": 4,"name":"giao"})
eat_process.start()
drink_process.start()
執行結果
可以看到參數成功的傳入到了所要執行的任務中
1、獲取當前進程的編號
os.getpid()
2、獲取當前進程的父進程的編號
os.getppid()
還是以吃飯喝湯為例,看代碼
import time
import multiprocessing
import os
def eat(num,name):
print("吃飯的進程ID:", os.getpid())
print("吃飯的主進程ID:", os.getppid())
for i in range(num):
print(name+"吃一口……")
time.sleep(1)
def drink(num,name):
print("喝湯的進程ID:", os.getpid())
print("喝湯的主進程ID:", os.getppid())
for i in range(num):
print(name+"喝一口……")
time.sleep(1)
if __name__ == '__main__':
# target:指定執行的函數名
# args:使用元組方式給指定任務傳參
# kwargs:使用字典方式給指定任務傳參
eat_process = multiprocessing.Process(target=eat,args=(3, "giao"))
drink_process = multiprocessing.Process(target=drink,kwargs={"num": 4, "name":"giao"})
print("主進程ID:", os.getpid())
eat_process.start()
drink_process.start()
結果如圖
可以清楚的看到,正常情況下,吃飯和喝湯的父進程是同一個進程,而吃飯和喝湯有不同的進程編號。
進程注意點
1、主進程會等待所有的子進程執行結束再結束。
看代碼示例
import multiprocessing
import time
def eat():
for i in range(10):
print("我吃我吃……")
time.sleep(0.5)
if __name__ == '__main__':
eat_process = multiprocessing.Process(target=eat)
eat_process.start()
time.sleep(1)
print("我吃飽了……")
運行結果如圖
發現主進程顯示已經吃飽了,但是子進程還是在吃,程序等到子進程運行完,才結束。
2、可以設置子進程守護,當主進程結束時,子進程也不再繼續執行,直接結束。
只需要再創建進程之後,加入這樣一句代碼
進程名稱.daemon = True
這樣子進程就會守護主進程,主進程結束,子進程也會自動銷毀。
看代碼
import multiprocessing
import time
def eat():
for i in range(10):
print("我吃我吃……")
time.sleep(0.5)
if __name__ == '__main__':
eat_process = multiprocessing.Process(target=eat)
# 設置進程守護
eat_process.daemon = True
eat_process.start()
time.sleep(1)
print("我吃飽了……")
運行結果如圖
可以明確看到,主進程結束後,子進程不再繼續執行,直接銷毀。