一、行程的創建
我們先來回憶下之前多執行緒的實作,
import threading
import time
def test1():
while True:
print("1------")
time.sleep(1)
def test2():
while True:
print("2------")
time.sleep(1)
def main():
t1 = threading.Thread(target=test1)
t2 = threading.Thread(target=test2)
t1.start()
t2.start()
if __name__ == "__main__":
main()
再來看看多行程的實作,
import multiprocessing
import time
def test1():
while True:
print("1------")
time.sleep(1)
def test2():
while True:
print("2------")
time.sleep(1)
def main():
t1 = multiprocessing.Process(target=test1)
t2 = multiprocessing.Process(target=test2)
t1.start()
t2.start()
if __name__ == "__main__":
main()
multiprocessing 模塊就是跨平臺版本的多行程模塊,提供了一個 Process 類來代表一個行程物件,這個物件可以理解為是一個獨立的行程,可以執行另外的事情,
創建子行程時,只需要傳入一個執行函式和函式的引數,創建一個 Process 實體,用start()方法啟動,
通過比較,會驚奇地發現,創建多執行緒和創建多行程,步驟幾乎是一樣的,
和使用 Thread 類創建多執行緒方法類似,使用 Process 類創建多行程也有以下 2 種方式:
- 直接創建 Process 類的實體物件,由此就可以創建一個新的行程;
- 通過繼承 Process 類的子類,創建實體物件,也可以創建新的行程,注意,繼承 Process 類的子類需重寫父類的 run() 方法,
二、Process 語法結構
Process([group [, target [, name [, args [, kwargs]]]]])
- target:如果傳遞了函式的參考,可以認為這個子行程就執行這里的代碼,
- args:給 target 指定的函式傳遞非關鍵字引數,以元組的方式傳遞,
- kwargs:給 target 指定的函式傳遞命名(關鍵字)引數,
- name:給行程設定一個名字,可以不設定,
- group:指定行程組,大多數情況下用不到,
Process 創建的實體物件的常用方法
- start():啟動子行程實體(創建子行程),
- is_alive():判斷行程子行程是否還在活著,
- join([timeout]):是否等待子行程執行結束,或等待多少秒,
- terminate():不管任務是否完成,立即終止子行程,
- run():繼承類中需要對該方法進行重寫,該方法中包含的是新行程要執行的代碼,
Process創建的實體物件的常用屬性
- name:當前行程的別名,默認為Process-N,N為從1開始遞增的整數,
- pid:當前行程的pid(行程號),
- daemon:和守護執行緒類似,通過設定該屬性為 True,可將新建行程設定為守護行程,
三、獲取行程的pid
from multiprocessing import Process
import os
def run_proc():
"""子行程要執行的代碼"""
# os.getpid獲取當前行程的行程號
print('子行程運行中,pid=%d...' % os.getpid())
print('子行程將要結束...')
if __name__ == '__main__':
# os.getpid獲取當前行程的行程號
print('父行程pid: %d' % os.getpid())
p = Process(target=run_proc)
p.start()
運行結果:
父行程pid: 12740
子行程運行中,pid=11192...
子行程將要結束...
四、給子行程指定的函式傳遞引數
from multiprocessing import Process
import os
from time import sleep
def run_proc(name, age, **kwargs):
for i in range(10):
print('子行程運行中,name= %s,age=%d ,pid=%d...' % (name, age, os.getpid()))
print(kwargs)
sleep(0.2)
if __name__ == '__main__':
p = Process(target=run_proc, args=('test', 18), kwargs={"m": 20})
p.start()
# 1秒中之后,立即結束子行程
sleep(1)
p.terminate()
p.join()
運行結果:
子行程運行中,name= test,age=18 ,pid=10024...
{'m': 20}
子行程運行中,name= test,age=18 ,pid=10024...
{'m': 20}
子行程運行中,name= test,age=18 ,pid=10024...
{'m': 20}
子行程運行中,name= test,age=18 ,pid=10024...
{'m': 20}
子行程運行中,name= test,age=18 ,pid=10024...
{'m': 20}

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/168763.html
標籤:Python
