Python Process創建進程的(2種方法)


Python 在 multiprocessing 模塊下提供了 Process 來創建新進程。與 Thread 類似的是,使用 Process 創建新進程也有兩種方式:

  1. 以指定函數作為 target,創建 Process 對象即可創建新進程。
  2. 繼承 Process 類,並重寫它的 run() 方法來創建進程類,程序創建 Process 子類的實例作為進程。


Process 類也有如下類似的方法和屬性:

        run():重寫該方法可實現進程的執行體。

        start():該方法用於啟動進程。

        join([timeout]):該方法類似於線程的 join() 方法,當前進程必須等待被 join 的進程執行完成才能向下執行。

        name:該屬性用於設置或訪問進程的名字。

        is_alive():判斷進程是否還活着。

        daemon:該屬性用於判斷或設置進程的后台狀態。

        pid:返回進程的 ID。

        authkey:返回進程的授權 key。

        terminate():中斷該進程。

 

import multiprocessing
import os
# 定義一個普通的action函數,該函數准備作為進程執行體
def action(max):
    for i in range(max):
        print("(%s)子進程(父進程:(%s)):%d" %
            (os.getpid(), os.getppid(), i))
if __name__ == '__main__':
    # 下面是主程序(也就是主進程)
    for i in range(100):
        print("(%s)主進程: %d" % (os.getpid(), i))
        if i == 20:
            # 創建並啟動第一個進程
            mp1 = multiprocessing.Process(target=action,args=(100,))
            mp1.start()
            # 創建並啟動第一個進程
            mp2 = multiprocessing.Process(target=action,args=(100,))
            mp2.start()
            mp2.join()
    print('主進程執行完成!')

可以發現和之前創建多線程似乎是同樣的過程和方法,只是這里用到的是  multiprocessing.Process ,運行上面程序,可以看到程序中運行了三個進程,一個主進程和程序啟動的兩個子進程。由於程序中調用了 mp2.join(),因此主進程必須等 mp2 進程完成后才能向下執行。

繼承Process類創建子進程

繼承 Process 類創建子進程的步驟如下:

        1.定義繼承 Process 的子類,重寫其 run() 方法准備作為進程執行體。

        2.創建 Process 子類的實例。

        3.調用 Process 子類的實例的 start() 方法來啟動進程

 

import multiprocessing
import os
class MyProcess(multiprocessing.Process):
    def __init__(self, max):
        self.max = max
        super().__init__()
    # 重寫run()方法作為進程執行體
    def run(self):
        for i in range(self.max):
            print("(%s)子進程(父進程:(%s)):%d" %
                (os.getpid(), os.getppid(), i))
if __name__ == '__main__':
    # 下面是主程序(也就是主進程)
    for i in range(100):
        print("(%s)主進程: %d" % (os.getpid(), i))
        if i == 20:
            # 創建並啟動第一個進程
            mp1 = MyProcess(100)
            mp1.start()
            # 創建並啟動第一個進程
            mp2 = MyProcess(100)
            mp2.start()
            mp2.join()
    print('主進程執行完成!')

通常,推薦使用第一種方式來創建進程,因為這種方式不僅編程簡單,而且進程直接包裝 target 函數,具有更清晰的邏輯結構。


免責聲明!

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



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