進程:通俗理解一個運行的程式或者軟體,進程是操作系統資源分配的基本單位 1.1、導入進程模塊 import multiprocessing 1.2、Process進程類的語法結構如下: Process([group[, target[, name[,args[,kwargs]]]]]) group: ...
進程:通俗理解一個運行的程式或者軟體,進程是操作系統資源分配的基本單位
1.1、導入進程模塊
import multiprocessing
1.2、Process進程類的語法結構如下:
Process([group[, target[, name[,args[,kwargs]]]]])
group: --指定進程組,目前只能使用None
target: --執行的目標任務名
name: --進程名字
args: --以元組方式給執行任務傳參
kwargs: --以字典方式給執行任務傳參
Process創建 的實例對象的常用方法:
start(), 啟動子進程實例(創建子進程)
join(timeout), 是否等待子進程執行結束,或等待多少秒
terminate(), 不管任務是否完成,立即終止進程
Process創建的實例對象的常用屬性:
name 當前進程的別名,預設為Process-N,N為從1開始遞增的整數。
pid 當前進程的pid(進程號)
一、多進程完成多任務代碼
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 """ 4 python進程 5 """ 6 import multiprocessing 7 import time 8 9 def run_proc(): 10 """ 11 子進程要執行的代碼 12 :return: 13 """ 14 while True: 15 print("---2---") 16 time.sleep(1) 17 18 if __name__ == "__main__": 19 #創建子進程 20 sub_process = multiprocessing.Process(target=run_proc) 21 #啟動子進程 22 sub_process.start() 23 while True: 24 print("----1----") 25 time.sleep(1)
代碼執行結果:
二、獲取進程pid
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 """ 4 獲取進程pid 5 """ 6 7 import multiprocessing 8 import time 9 import os 10 11 def work(): 12 #查看當前進程 13 current_process = multiprocessing.current_process() 14 print("work:", current_process) 15 #獲取當前進程的編號 16 print("work進程編號:", current_process.pid, os.getpid()) 17 #獲取父進程的編號 18 print("work父進程的編號:", os.getppid()) 19 for i in range(10): 20 print("工作中....") 21 time.sleep(0.2) 22 #擴展,根據進程編號殺死對應的進程 23 os.kill(os.getpid(), 9) 24 25 if __name__ == "__main__": 26 #查看當前進程 27 current_process = multiprocessing.current_process() 28 print("main:", current_process) 29 #獲取當前里程的編號 30 print("main進程的編號:", current_process.pid) 31 32 #創建子進程 33 sub_process = multiprocessing.Process(target=work) 34 #啟動進程 35 sub_process.start() 36 37 #主進程執行列印信息操作 38 for i in range(5): 39 print("我在主進程中執行....") 40 time.sleep(0.2)
代碼執行結果:
三、進程的基本狀態及狀態之間的關係
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 """ 4 給子進程指定的函數傳遞參數 5 """ 6 7 import multiprocessing 8 9 #定義一個用於顯示信息的方法 10 def show_info(name, age): 11 print("name:", name, "; age:", age) 12 13 if __name__ == "__main__": 14 sub_process = multiprocessing.Process(target=show_info, args=("yusheng_liang", 20)) 15 #啟動進程 16 sub_process.start()
代碼執行結果:
四、進程之間不共用全局變數
註意:創建子進程其實是對主進程進行拷貝,進程之間相互獨立,訪問的全局變數不是同一個,所以進程之間不共用全局變數
#!/usr/bin/env python # -*- coding:utf-8 -*- """ 進程之間不共用全局變數 """ import multiprocessing import time #定義全局變數 my_list = list() #定義寫入數據的方法 def write_data(): for i in range(5): my_list.append(i) time.sleep(0.2) print("write_data: ", my_list) #定義讀取數據的方法 def read_data(): print("read_data: ", my_list) if __name__ == "__main__": #創建寫入數據的進程 write_process = multiprocessing.Process(target=write_data) #創建讀取數據的進程 read_process = multiprocessing.Process(target=read_data) write_process.start() #主進程等待寫入進程執行完成以後代碼,再繼續往下執行 write_process.join() read_process.start()
代碼執行結果:
五、主進程會等待所有的子進程執行完成程式再退出
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 """ 4 主進程會等待所有的子進程執行完成程式再退出 5 """ 6 import multiprocessing 7 import time 8 9 #測試子進程是否執行完成以後主進程才能退出 10 def work(): 11 for i in range(7): 12 print("工作中.....") 13 time.sleep(0.2) 14 15 if __name__ == "__main__": 16 #創建子進程 17 work_process = multiprocessing.Process(target=work) 18 work_process.start() 19 20 #讓主進程等待1秒鐘 21 time.sleep(1) 22 print("主進程執行完成了啦!!") 23
代碼執行結果:
六、銷毀子進程的代碼
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 """ 4 主進程會等待所有的子進程執行完成程式再退出 5 """ 6 import multiprocessing 7 import time 8 9 #測試子進程是否執行完成以後主進程才能退出 10 def work(): 11 for i in range(7): 12 print("工作中.....") 13 time.sleep(0.2) 14 15 if __name__ == "__main__": 16 #創建子進程 17 work_process = multiprocessing.Process(target=work) 18 work_process.start() 19 20 #讓主進程等待1秒鐘 21 time.sleep(1) 22 print("主進程執行完成了啦!!") 23 24 #讓子進程直接銷毀,表示終止執行,主進程退出之前,把所有的子進程直接銷毀就可以了 25 work_process.terminate()
代碼執行的結果: