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
建立進程可使用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