python學習筆記 day35 進程(二)

1. 不一樣進程之間的資源是互相隔離的

from multiprocessing import Process
import os

n=100  # 每次開啓一個進程就會把這裏的代碼從頭至尾執行一遍,因此每個進程開始的n都是100,每開啓一個進程對全局變量n都會執行減一操做
def func():
    global n
    n-=1
    print("子進程:%s,參數n:%s"%(os.getpid(),n))
if __name__=="__main__":
    for i in range(10):  # 建立10個進程
        p=Process(target=func)  # 開啓的每個進程都是執行func函數
        p.start()
    print("主進程:%s,參數n:%s"%(os.getpid(),n))

運行結果:函數

 

因此不一樣進程之間的數據是徹底隔離的;spa

2. 建立進程的另外一種方式

建立進程可使用Process類 或者能夠本身建立一個類:3d

from multiprocessing import Process
import os

class MyProcess(Process):  # 自定義一個類繼承自Process類
    def run(self):  # 當建立的子進程對象執行start方法時 就會自動調用r類內的un方法
        print("子進程:%s"%os.getpid())

if __name__=="__main__":
    p=MyProcess()   # 實例化一個類,建立進程
    p.start()   # 就會自動執行MyProcess類的run()方法
    print("主進程:%s"%os.getpid())
    

運行結果:code

 

 但是若是咱們想對要建立的子進程執行的函數傳遞一個參數,應該怎麼操做:對象

其實只須要在建立類的時候,初始化方法中傳遞參數便可:blog

from multiprocessing import Process
import os

class MyProcess(Process):   # 建立一個類,繼承自Process
    def __init__(self,arg1,arg2):
        super().__init__()   # 須要繼承自父類Process的初始化方法,不要進行重寫初始化方法,不然會覆蓋,
        self.arg1=arg1
        self.arg2=arg2
    def run(self):  # 建立的進程對象執行start方法時會自動執行類中的run方法
        print("子進程:%s,參數(%s,%s)"%(os.getpid(),self.arg1,self.arg2))


if __name__=="__main__":
    p=MyProcess(1,2)  # 建立一個進程
    p.start()  # 開啓一個進程,會自動執行類MyProcess類中的run()方法
    print("主進程:%s"%os.getpid())

運行結果:繼承

 

 在自定義的類中實現其餘的方法(好比下面例子中的walk()方法),在主進程中調實際上是在主進程中執行類中的方法,在類內調用類內的方法,會在子進程中執行類中的方法:進程

from multiprocessing import Process
import os

class MyProcess(Process):   # 建立一個類,繼承自Process
    def __init__(self,arg1,arg2):
        super().__init__()   # 須要繼承自父類Process的初始化方法,不要進行重寫初始化方法,不然會覆蓋,
        self.arg1=arg1
        self.arg2=arg2
    def run(self):  # 建立的進程對象執行start方法時會自動執行類中的run方法
        print("子進程:%s,參數(%s,%s)"%(os.getpid(),self.arg1,self.arg2))
        self.walk()  # 在run()方法中調用walk()方法,就是在子進程中執行該方法
    def walk(self):
        print("子(主)進程:%s"%os.getpid())  # 在類內調用walk()方法,就是子進程來執行,就是子進程的pid號,在主進程中調用walk()方法就由主進程來執行該方法,相應的就是主進程的pid號

if __name__=="__main__":
    p=MyProcess(1,2)  # 建立一個進程
    p.start()  # 開啓一個進程,會自動執行類MyProcess類中的run()方法
    print("主進程:%s"%os.getpid())
    p.walk()   # 打印主進程的pid號,由於是在主進程中調用的該方法

運行結果:ip

相關文章
相關標籤/搜索