python中的進程(一)


一 : 概述

  進程由三部分組成 : 代碼段,數據段,PCB(進程控制塊)

  Python中的進程編程依賴於multiprocessing這個包,其中Process類就是提供最基礎的功能的類

二 : 使用Process類創建進程

  使用Process類可以創建新的進程,有兩種使用方法:

    1.實例化Process類,參數如下:

      group參數未使用,值始終為None;

      target表示調用對象,即子進程要執行的任務,也就是方法名,不是字符串形式,也不帶括號;

      args表示調用對象的位置參數元組,args=(1,2,'egon',);

      kwargs表示調用對象的字典,kwargs={'name':'egon','age':18};

      name為子進程的名稱.

    這種方法需要先寫好一個方法,作為參數傳入Process實例化時候調用的__init__()方法

def func(i):
time.sleep(1)
print('這里是子進程')


if __name__ == '__main__':
p = Process(target=func, args=(1,)) # 實例化一個進程對象
p.start() # 開啟一個子進程
print('這里是父進程')

# 結果:
# 這里是父進程
# 這里是子進程

    2.新寫一個Process類的子類,初始化直接調用父類的初始化方法,自己實現一個名為run()的方法,這個方法提供的作用相當於方法1中提前寫好的那個方法

class MyProcess(Process):
    def __init__(self):
        super(MyProcess, self).__init__()

    def run(self):
        print('這是以繼承類的方式開啟的子進程')


if __name__ == '__main__':
    p1 = MyProcess()
    p1.start()

# 結果:
# 這是以繼承類的方式開啟的子進程

三 : 進程對象的使用

  創建進程(進程類實例化)之后,需要調用start()方法啟動它,我們知道,一個進程啟動之后到銷毀之前,有三種狀態:就緒/阻塞/運行,調用該方法之后,進程就會進入就緒狀態,等待操作系統給它分配時間片.

  其他方法介紹:

    run():進程啟動時運行的方法,正是它去調用target指定的函數,我們自定義類的類中一定要實現該方法;

    terminate():強制終止進程p,不會進行任何清理操作,如果p創建了子進程,該子進程就成了僵屍進程,使用該方法需要特別小心這種情況。如果p還保存了一個鎖那么也將不會被釋放,進而導致死鎖

    is_alive():如果p仍然運行,返回True

    join([timeout]):主線程等待p終止(強調:是主線程處於等的狀態,而p是處於運行的狀態)。timeout是可選的超時時間,需要強調的是,p.join只能join住start開啟的進程,而不能join住run開啟的進程

  run()和start()的糾葛:

    start()方法調用的就是run()方法,但是start()只是讓進程處於就緒狀態,run()則是讓進程進入運行狀態,大約相當於start()+join()的效果,所以run()之后也不會再調用join().

  常用屬性:

    name : 給進程一個名字;

    pid : 進程的pid

    daemon : 默認為False,當為True時,該進程為守護進程

四 : 守護進程

  特點 : 1.守護進程隨着父進程的結束而結束,普通子進程運行完父進程才會結束,即使父進程代碼塊已經運行完畢.

       2.守護進程不能再創建子進程.

  創建 : 將實例化出的進程對象的daemon屬性設定為True即可,該語句需要在start()語句之前.


免責聲明!

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



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