進程的執行順序


程序是什么?進程是什么?

本質上就是一堆代碼文件,一個程序正在被操作系統讀取並執行,就會變成了進程

啟動進程的方式

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
"""

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM