程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python多進程

編輯:Python

一、單進程示例

舉例一個吃飯活動,有一碗湯和一碗飯,正常操作是一口飯一口湯(當然你先把湯或者飯一口氣吃完,當我無話可說)。單進程只能是先吃完飯,再喝湯;或者是先喝完湯,再吃飯。

看代碼

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("我吃飽了……")

運行結果如圖

可以明確看到,主進程結束後,子進程不再繼續執行,直接銷毀。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved