一.今日大綱windows
1.multiprocessing模塊簡單應用併發
2.for循環建立進程異步
3.進程傳參方式和建立方式2spa
4.join方法操作系統
5.操做系統基礎code
二.今日內容對象
(1)操做系統簡單介紹
多道技術:(超級重點)
空間複用
時間複用
進程之間是空間隔離的
分時系統
實時系統
通用操做系統(遇到io切換的會提升代碼效率),
併發:又稱僞併發,看着像同時運行,實際上是任務之間的切換(遇到IO切換的會提升代碼效率)
任務切換+保存狀態(保存現場)
並行:真正的同時在運行,應用的是多核技術(多個cpu)
進程三狀態:就緒(等待操做系統調度去cpu裏面執行) 執行 阻塞
提交任務的方式:同步異步
任務的執行狀態:阻塞非阻塞
異步:任務的提交方式,多個任務提交出去,同時執行
同步堵塞:
異步堵塞:
同步非堵塞:
異步非堵塞:
(這裏是開啓進程)
(2)進程的兩種建立方式
Process(target=f1,args=(i,)) kwargs={'形參名爲key':值}
(3)
#例子
from multiprocessing import Process
class MyProcess(Process): #繼承
def __init(self,n):
super().__init__()
self.n=n
def run(self):
pass
if __name__='__main__':
P=MyProcess(12)
P.start()
join方法:主進程等待子進程執行結束再繼續執行
沒有join的話,先執行主進程中的內容
for 循環開啓進程
三.詳細內容
(1)multiprocessing模塊簡單應用:
#運行中的程序叫作進程 import time time.sleep(1) print('123')
#操做系統是大型軟件
#操做系統幫助咱們調用硬件的
重點代碼&重點註釋分析
進程的建立方式1
import time from multiprocessing import Process def f1(): time.sleep(3) print('xxx') def f2(): time.sleep(3) print('sss') #f1() #f2() #重點理解:windows系統下必須寫main,由於windows系統建立子進程的方式決定的,開啓一個子進程, # 這個子進程會copy一份主進程的全部代碼,而且機制相似於import引入,這樣就容易致使引入代碼的時候, # 被引入的代碼中的可執行程序被執行,致使遞歸開始進程,會報錯 if __name__=='__main__': p1=Process(target=f1,) #子進程至關於copy主進程的內容一份 p2=Process(target=f2,) p1.start() #先調用主程序內的,再執行本身的而且, # 全部start必須執行完,才能夠執行, p2.start() time.sleep(3) #僅限於咱們的程序 # p1.join() #意思是子進程執行完才執行主進程 # p2.join() print('我是主進程!!') ''' 不註釋 p1.join() p2.join(): 結果: xxx sss 我是主進程!! 註釋 p1.join() p2.join(): 結果: 我是主進程!! xxx sss '''
(2)for循環建立進程blog
import time from multiprocessing import Process def f1(i): time.sleep(1) print(i) if __name__=='__main__': for i in range(20): p1=Process(target=f1,args=(i,)) #傳參 p1.start()
注意:上邊獲得的結果是:0-19的20行數字,而且不是按照有序排列的繼承
(3)演示兩種傳參方式遞歸
演示兩種傳參方式 方式一: # import time # from multiprocessing import Process # def f1(i): # time.sleep(3) # print(i) # if __name__=='__main__': # p1=Process(target=f1,args=('冬瓜與黃瓜',)) #傳參 # p1.start() #給操做系統發送一個建立進程的信號,後續進程的建立都是操做系統的事 方式二 # import time # from multiprocessing import Process # # def f1(i): # time.sleep(3) # print(i) # if __name__=='__main__': # p1=Process(target=f1,kwargs={'i':'大牛'}) #傳參//建立進程對象 # p1.start() #給操做系統發送一個建立進程的信號,後續進程的建立都是操做系統的事
案例:
from multiprocessing import Process class MyProcess(Process): def run(self): print('寶寶') if __name__=='__main__': p1=MyProcess() p1.start()
(4)進程的建立方式2
#傳參:須要從新寫一個init方法 from multiprocessing import Process class MyProcess(Process): def __init__(self,n): super().__init__() #先執行父類的方法 #別忘了執行父類的init '''''' ''' 沒有上面的一句話,會報錯,緣由是下面,因此必須繼承父類的參數 assert self._popen is None, 'cannot start a process twice' AttributeError: 'MyProcess' object has no attribute '_popen' ''' self.n=n #本身定義的形式參數n def run(self): print('寶寶and%s不可告人的事情'%self.n) if __name__=='__main__': p1=MyProcess('搞忘') p1.start()
(5)join方法
import time from multiprocessing import Process def f1(): time.sleep(2) print('xxxx') def f2(): time.sleep(2) print('ssss') # f1() # f2() if __name__ == '__main__': p1 = Process(target=f1,) p1.start() p1.join() # 主進程等待子進程運行完才繼續執行 print('開始p2拉') #這個地方至關於主進程 p2 = Process(target=f2,) p2.start() p2.join() print('我要等了...等個人子進程...') time.sleep(3) print('我是主進程!!!') ''' 若是把兩個join()方法註釋掉,結果是: 開始p2拉 我要等了...等個人子進程... xxxx ssss 我是主進程!!! 不註釋的結果是: xxxx 開始p2拉 ssss 我要等了...等個人子進程... 我是主進程!!!