35 並行/發 同/異步 非/ 阻塞 進程的兩種開啟方式, 進程的常用方法及屬性
阿新 • • 發佈:2018-08-20
self 屬性 任務序列 設置 並行 告訴 方法 main 解釋器 。至於被依賴的任務最終是否真正完成,依賴它的任務無法確定, 所以它是不可靠的任務序列.
主要內容:
1 名詞解釋
並行 : 即兩件事情或多件事情,在同一時間點同時執行.是從微觀上,也就是在一個精確的時間片刻,有不同的程序在執行,這就要求必須有多個處理器
並發 : 即兩件事情或多件事情在同一時間段交替進行. 是從宏觀上,在一個時間段上可以看出是同時執行的,比如一個服務器同時處理多個session。
同步 : 所謂同步就是一個任務的完成需要依賴另外一個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成,這是一種可靠的任務序列。要麽成功都成功,失敗都失敗,兩個任務的狀態可以保持一致。
異步 : 所謂異步是不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什麽工作,依賴的任務也立即執行,只要自己完成了整個任務就算完成了
阻塞 :
非阻塞 :
2 . 開啟進程兩種方式
1) 第一種
from multiprocessing import Process import os import time def func(i): time.sleep(0.2) print(‘這是子進程%s,pid為%s ,其父進程的pid為%s‘ % (i, os.getpid(), os.getppid())) # os.getpid(), 獲得當前進程的pid, # os.getppid(),獲得當前進程的父進程的pidif __name__ == ‘__main__‘: for i in range(2): p = Process(target=func, args=(i,)) #實例化一個進程對象 #target:子進程要執行的任務,args:父進程要給子進程傳遞的參數,必須是元祖形式. p.start() #開啟一個進程. time.sleep(0.2) print(‘這是父進程, pid為%s, 其父進程的pid為%s‘ % (os.getpid(), os.getppid()))
2) 繼承
from multiprocessing import Process import time import os class Myprocess(Process): def __init__(self): super(Myprocess, self).__init__() def run(self): print(‘在類中創建子進程‘) if __name__ == ‘__main__‘: p = Myprocess() p.start() #是指解釋器告訴操作系統, 去幫我開啟一個進程, 就緒狀態 p.run() # 解釋器告訴操作系統,馬上幫我執行這個過程. 執行狀態
帶名字的
from multiprocessing import Process import time import os class Myprocess(Process): def __init__(self, name): self.name = name super(Myprocess, self).__init__(name = name) # 如果不寫在執行父類中的__init是name會被覆蓋. def run(self): print(‘這是以類的方式開啟的子進程, 名字為%s‘ % self.name) if __name__ == ‘__main__‘: p = Myprocess(‘alex‘) p.start() #是指解釋器告訴操作系統, 去幫我開啟一個進程, 就緒狀態. # p.run() # 解釋器告訴操作系統立即去開啟一個進程, 執行狀態.
3 . 進程的常用方法:
1) start 和join
join : 是讓主進程等待子進程執行完再執行
from multiprocessing import Process import os import time def func(): for i in range(100): time.sleep(0.1) print(‘這是子進程‘) if __name__ == ‘__main__‘: p = Process(target=func) #子進程要執行的任務 p.start() # p.join() #是讓主進程等待子進程執行完, 現象 : 主進程走到這句話, 主進程阻塞住, 等待子進程執行完. for i in range(100): time.sleep(0.1) print(‘這是父進程‘) # 開啟一個正常的子進程,父進程會等待子進程結束後,父進程也就是程序才結束 # p.join()# 是讓主進程等待子進程執行完。 現象:主進程執行到這句話,主進程阻塞住,等待子進程執行 # 如何把父進程和子進程之間的關系變為同步或者異步? # 父進程執行join,就會變成同步,不執行join,父進程和子進程就是異步的關系 # join必須放在start()後邊
2) is_alive 和terminate
def func(): time.sleep(1) if __name__ == ‘__main__‘: p = Process(target=func,) p.start() p.terminate()# 殺死p進程,讓解釋器告訴操作系統,請殺掉p進程。 print(‘子進程是否還活著?‘, p.is_alive()) time.sleep(0.002) print(‘子進程是否還活著?‘, p.is_alive()) # 返回一個bool值,如果返回True,代表進程還活著,如果返回False,代表子進程死了 # p.is_alive() 判斷p進程是否還活著 # p.terminate() 殺死p進程
4 . 進程的常用屬性:
1) name 和 pid
from multiprocessing import Process
import time
import os
def func():
print(‘這是子進程, pid為%s‘ % os.getpid())
if __name__ == ‘__main__‘:
p = Process(target=func)
p.start()
p.name = ‘alex‘
print(‘可以查看子進程的pid‘,p.pid)
print(‘可以查看子進程的名字‘, p.name)
print(‘子進程是不是守護進程‘, p.daemon) false
2 ) 守護進程
特點 : 將進程設置為守護進程 , 必須在start之前 daemon = false
守護進程會隨著主進程的結束而結束
守護進程不能有子進程.
**守護進程會隨著主進程的結束而結束
from multiprocessing import Process
import time
def func():
time.sleep(3.1)
print(‘this is son process‘)
if __name__ == ‘__main__‘:
p = Process(target=func)
p.daemon = True #必須在start之前設置
p.start()
time.sleep(3)
print(‘this is parent process‘)
#守護進程會隨著主進程的結束而結束.
**守護進程不能有子進程
from multiprocessing import Process
import time
def func1():
print(‘這裏是孫子‘)
def func():
p = Process(target=func1)
p.start()
time.sleep(5)
print(‘這裏是兒子哦‘)
if __name__ == ‘__main__‘:
p = Process(target=func)
p.daemon = True # 將p進程設置為守護進程,必須要在start之前設置
p.start()
time.sleep(1)
print(‘這是爸爸‘)
# 守護進程:不允許開啟子進程
35 並行/發 同/異步 非/ 阻塞 進程的兩種開啟方式, 進程的常用方法及屬性