方法一:python
multiprocess不是一個模塊而是python中一個操做、管理進程的包。 之因此叫multi是取自multiple的多功能的意思,在這個包中幾乎包含了和進程有關的全部子模塊。因爲提供的子模塊很是多,爲了方便你們歸類記憶,我將這部分大體分爲四個部分:建立進程部分,進程同步部分,進程池部分,進程之間數據共享。重點強調:進程沒有任何共享狀態,進程修改的數據,改動僅限於該進程內windows
from multiprocessing import Process併發
def func(n):
print(n)
if __name__=="__main__":
p=Process(target=func,args=(5,)) #建立子進程,並傳參,參數元組形式 也能夠傳關鍵字參數kwargs={"n":5}必須是字典key要與方法中的形參相同一致
p.start() #操做系統發送指令建立進程並運行target=方法
方法二:
from multiprocessing import Process
class MyProcess(Process): #建立類
def __init__(self,n,name):
super().__init__() #執行下一個mro 直接寫不加任何參數
self.n=n #傳參數
self.name=name
def run(self): #重寫run方法
print(self.n)
print("子進程名稱",self.name)
print("子進程pid",self.pid)
if __name__=="__main__":
p=MyProcess(100,name="子進程1") #建立進程
p.start() #操做系統發送指令開闢進程並運行run方法
print("pid",p.pid)
參數介紹:
參數介紹:
1 group參數未使用,值始終爲None
2 target表示調用對象,即子進程要執行的任務
3 args表示調用對象的位置參數元組,args=(1,2,'egon',)
4 kwargs表示調用對象的字典,kwargs={'name':'egon','age':18}
5 name爲子進程的名稱
進程之間是空間隔離的:
process中的其餘操做方法:
1. p.start():啓動進程,並調用該子進程中的p.run()
2. p.run():進程啓動時運行的方法,正是它去調用target指定的函數,咱們自定義類的類中必定要實現該方法
3. p.terminate():強制終止進程p,不會進行任何清理操做,若是p建立了子進程,該子進程就成了殭屍進程,使用該方法須要特別當心這種狀況。若是p還保存了一個鎖那麼也將不會被釋放,進而致使死鎖
4. p.is_alive():若是p仍然運行,返回True
5. p.join([timeout]):主線程等待p終止(強調:是主線程處於等的狀態,而p是處於運行的狀態)。timeout是可選的超時時間,須要強調的是,p.join只能join住start開啓的進程,而不能join住run開啓的進程
for循環在併發中的使用:
# 驗證for循環
def func1(i):
time.sleep(1)
print(i)
if __name__=="__main__":
lst=[]
for i in range(10):
p1=Process(target=func1,args=(i,))
p1.start()
lst.append(p1)
for el in lst: 在對象後加join
el.join()
print("主程序運行完成")
驗證併發時間:
# 驗證併發時間
# def func1(n):
# time.sleep(n)
# print(n)
# def func2(n):
# time.sleep(n)
# print(n)
# def func3(n):
# time.sleep(n)
# print(n)
# if __name__=="__main__":
# p1=Process(target=func1,args=(1,))
# p2=Process(target=func2,args=(2,))
# p3=Process(target=func3,args=(3,))
# p1.start()
# p2.start()
# p3.start()
# print("主程序運行完成")
子進程開啓以後我們是無法操做的,而且沒有爲子進程input輸入提供控制檯,全部你再在子進程中寫上了input會報錯,EOFError錯誤