python中多進程應用及僵屍進程、孤兒進程


一、python如何使用多進程

創建子進程的方式

1.導入multiprocessing 中的Process類 實例化這個類 指定要執行的任務 target

import os
from multiprocessing import Process
"""
Process 就表示進程
為什么要開進程
"""

def task():
    print("this is sub process")
    print("sub process id %s" % os.getpid())


if __name__ == '__main__':
    # ######注意 開啟進程的代碼必須放在 ————main————判斷下面
    #  實例化一個進程對象 並制定他要做的事情  用函數來指定
    p = Process(target=task)
    p.start() # 給操作系統發送消息 讓它開啟進程
    print("this is parent process")
    print("parent process is: %s" % os.getpid())
    print("over")

linux 與windows開啟進程的方式不同

linux 會將父進程的內存數據 完整copy一份給子進程

注意:

​ windows 會導入父進程的代碼 從頭執行一遍 來獲取需要處理的任務

​ 所以在編寫代碼時如果是windows一定要將開啟進程的代碼放main判斷中

​ linux 可以不放

2.導入multiprocessing 中的Process類 繼承這個類 覆蓋run方法 將要執行的任務放入run中開啟進程時會自動執行該函數

from multiprocessing import Process
import os


class Downloader(Process):

    # def __init__(self,url,size,name):
    #     super().__init__()
    #     self.url = url
    #     self.size = size
    #     self.name = name

    def run(self):
        print(os.getpid())
        pass

if __name__ == '__main__':
    m = Downloader()
    m.start()
    print("parent over",os.getpid())

如果需要對進程對象進行高度自定義那就可以繼承它

進程之間內存相互隔離

from multiprocessing import  Process
import os,time

a = 257


def task():
    global a
    # print("2",a,id(a))
    a = 200
     

if __name__ == '__main__':
    p = Process(target=task)
    p.start() # 向操作系統發送指令

    time.sleep(4)
    print(a)

join函數

from multiprocessing import Process
import time
def task1(name):
    for i in range(10000):
        print("%s run" % name)

def task2(name):
    for i in range(100):
        print("%s run" % name)

if __name__ == '__main__': # args 是給子進程傳遞的參數 必須是元組
    p1 = Process(target=task1,args=("p1",))
    p1.start()  # 向操作系統發送指令
    # p1.join()   # 讓主進程 等待子進程執行完畢在繼續執行

    p2 = Process(target=task2,args=("p2",))
    p2.start()  # 向操作系統發送指令

    p2.join()  # 讓主進程 等待子進程執行完畢在繼續執行
    p1.join()


    #需要達到的效果是 必須保證兩個子進程是並發執行的 並且 over一定是在所有任務執行完畢后執行
    print("over")

案例:

# join的使用
from multiprocessing import Process
import time
def task1(name):
    for i in range(10):
        print("%s run" % name)


if __name__ == '__main__': # args 是給子進程傳遞的參數 必須是元組


    ps = []
    for i in range(10):
        p = Process(target=task1,args=(i,))
        p.start()
        ps.append(p)

    # 挨個join以下
    for i in ps:
        i.join()

    print("over")

二、僵屍進程與孤兒進程

孤兒進程 當父進程已經結束 而子進程還在運行 子進程就稱為孤兒進程 尤其存在的必要性,沒有不良影響

僵屍進程 當一個進程已經結束了但是,它仍然還有一些數據存在 此時稱之為僵屍進程

在linux中,有這么一個機制,父進程無論什么時候都可以獲取到子進程的的 一些數據

子進程 任務執行完畢后,確實結束了但是仍然保留一些數據 目的是為了讓父進程能夠獲取這些信息

linux中 可以調用waitpid來是徹底清除子進程的殘留信息

python中 已經封裝了處理僵屍進程的操作 ,無需關心


免責聲明!

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



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