程序是什么?進程是什么?
本質上就是一堆代碼文件,一個程序正在被操作系統讀取並執行,就會變成了進程
啟動進程的方式
1.系統初始化,會產生一個跟進程
2.用戶的交互請求 鼠標雙擊某個程序
3.在一個進程發起系統調用啟動另一個程序*****
4.在批處理作業開始在某些專用計算可能被使用
不同系統創建進程的方式不同
unix 《centos MAC linux》
完全拷貝父進程的所有數據,子進程可以訪問父進程的數據?不可以。但是可以訪問拷貝過來數據副本
windows
創建子進程,加載父進程中所有可執行的文件。
實現子進程的方式
from multiprocessing import Process #創建子進程的對象的方法 import time,os def task(name):#子進程運行的是函數 print(name,"running") time.sleep(2) print(name,"stop") if __name__ == '__main__': #創建一個子進程對象,target = 傳入指定運行函數,args = kwargs = 是將函數需要的參數如何傳給函數 p = Process(target=task,args=("msj",)) p.start()#啟動子進程(這是就有操作系統來分配計算資源) print("父進程/當前程序進程編號",os.getpid())#獲得當前執行文件的進程id print("是什么調用當前程序", os.getpid())#獲得當前執行文件的父進程id print("子進程編號",p.pid)#查看子進程的id
主進程與子進程的執行順序
一旦啟動子進程,后續代碼就會並發,沒有先后順序
也可以使用.join()等待子進程結束才能開始
from multiprocessing import Process import time def task(i): print(i,"start") time.sleep(i) print(i, "end") if __name__ == '__main__': start_time = time.time() for i in range(1,4): p = Process(target=task,args=(i,)) p.start() print("主進程") print("運行時間",time.time()-start_time)#這是子進程與父進程在操作系統處理優先級相同,隨意隨機執行。 #同時子進程存在阻塞,所以父進程會先執行,同時根據相聚時間太緊,所以根據阻塞時間輸出 “”“ 主進程 運行時間 0.059999942779541016 1 start 2 start 3 start 1 end 2 end 3 end ”“”
join的使用
from multiprocessing import Process import time def task(i): print(i,"start") time.sleep(i) print(i, "end") if __name__ == '__main__': start_time = time.time() for i in range(1,4): p = Process(target=task,args=(i,)) p.start() #join()函數就是等待子進程的,無參等到結束,有參int表示等待秒數 p.join()#,這樣相當於父進程需要等待每一個子進程(1+2+3+其他代碼執行的時間)6.623085975646973 print("主進程") print("運行時間",time.time()-start_time)
減少join的等待時間
from multiprocessing import Process import time def task(i): print(i,"start") time.sleep(i) print(i, "end") if __name__ == '__main__': start_time = time.time() ps = [] for i in range(1,4): p = Process(target=task,args=(i,)) ps.append(p) p.start() for p in ps: p.join()#同時並發等待,所以只需要最長時間(3+) print("主進程") print("運行時間",time.time()-start_time) """ 2 start 1 start 3 start 1 end 2 end 3 end 主進程 運行時間 3.3100392818450928 """