併發編程 學習目標: 見35複習一、操做系統 什麼是操做系統 操做系統的兩大做用: 批處理操做系統: 操做系統發展史: 多道技術***** 產生背景: 兩大核心點: 應用軟件的優化的核心:*****二、進程 一、進程理論(*****) 一、進程與程序區別 二、併發,並行,串行是什麼 三、不一樣操做系統開啓子進程的區別 四、一個進程的三種運行狀態 二、開啓進程的兩種方式(*****) 3.多進程的執行順序 ****** 四、進程對象的經常使用屬性 5 殭屍進程和孤兒進程(瞭解)** 六、守護進程(**) 見36複習 七、互斥鎖與信號量(**) 是什麼 爲何使用 互斥鎖與join的區別: 如何使用 注意強調點 Semaphore信號量(瞭解) 八、IPC機制:隊列,管道(*) 三種方式 九、進程queue=管道+鎖 (***) 十、生產者消費者模型(*****) 見37複習 一、什麼是生產者消費者模型? 二、什麼用生產者消費者模型? 三、爲何要用生產者消費者模型?好處? 四、如何實現? 總結點三、線程 一、線程理論(*****)見37複習 一、是什麼 二、線程vs進程 二、開啓線程的兩種方式(*****) 三、守護線程(**) 四、互斥鎖與信號量(**)見38複習 五、GIL vs 互斥鎖(*****) 一、什麼是GIL 二、GIL的影響 三、GIL的優缺點: 四、GIL vs 互斥鎖 6 Cpython的解釋器下***** 七、死鎖現象與遞歸鎖(**) 八、線程queue(***) 九、Event事件(**)四、池(*****)見38複習 是什麼 爲什麼要用池: 何時用池: 如何用池? 總結點五、單線程下實現併發(***) 見39複習 1 同步調用 異步調用+回調機制 提交任務的兩種方式: 什麼是同步異步 任務執行的三種狀態: 同步調用vs阻塞,兩種不一樣的'等'的效果 異步回調 ****** 什麼是異步回調? 爲何須要回調?(好比 燒水壺,水燒開後 水壺會發出響聲) 注意點: 回調函數何時被執行? 誰在執行回調函數? 線程的異步回調 2.線程隊列 ** 隊列 堆棧 優先級隊列 三、單線程下實現併發(***) 什麼是協程 併發 併發實現的本質=切換+保存狀態(兩類切換) 高性能分析: 爲何須要協程 如何實現協程(三種) 協程的應用場景: 總結點:六、網絡IO模型(主要掌握理論***) 見40複習 網絡傳輸中的兩個階段 1.阻塞IO 2.非阻塞IO 3.多路複用 4.異步IOsockserver---------------------------------------------------併發編程 學習目標:讓服務器可以支持高併發+高性能一、什麼是操做系統 操做系統是位於計算機硬件與應用軟件之間 用於協調、控制、管理計算機硬件與軟件的資源的一種控制程序 操做系統的兩大做用: 一、把複雜醜陋的硬件操做都封裝成美麗的接口,提供給應用程序使用 二、把進程對硬件的競爭變的有序 操做系統發展史: 第一代計算機 程序是固定 沒法修改 某種計算機只能幹某種活 第二代計算機 批處理系統 須要人工參與 將程序攢成一批 統一執行 串行執行 提升計算機的利用率 可是調試麻煩 批處理操做系統:(串行) 把程序員的程序攢成一堆 而後批處理系統讀一道程序到內存而後執行 執行完畢後輸出,而後才能讀入下一道程序。。。 第三代計算機 爲了更好利用計算機資源 ,產生了多道技術 多道技術***** 產生背景:在單核背景下實現多個進程併發執行的效果 兩大核心點: 一、空間上的複用 (多道程序複用內存的空間) 內存分割爲多個區域 每一個區域存儲不一樣的應用程序 內存中同時讀入多道程序,多道程序的內存空間是物理隔離的 二、時間上的複用 (多道程序複用CPU時間) 切換+保存狀態 1 正在執行的進程遇到IO操做時 會切換到其它程序 能夠提升效率 2 運行時間過長 或者有一個優先級更高的進程搶走了CPU 反而會下降效率 (固然由於cpu速度賊快 用戶感受不到)!!!!!應用軟件的優化:最核心的優化就是減小IO操做,減小對硬盤的讀寫操做二、進程 一、進程理論(*****) 進程:正在進行的一個過程或者說一個任務。而負責執行任務則是cpu。 舉例(單核+多道,實現多個進程的併發執行): egon在一個時間段內有不少任務要作:python備課的任務,寫書的任務,交女友的任務,王者榮耀上分的任務, 但egon同一時刻只能作一個任務(cpu同一時間只能幹一個活),如何才能玩出多個任務併發執行的效果? egon備一會課,再去跟李傑的女友聊聊天,再去打一會王者榮耀....這就保證了每一個任務都在進行中. 進程與程序區別 程序說白了就是一堆文件 進程就是一個正在執行的過程/程序 是一個資源單位 二、併發與並行 併發:看起來同時運行,實際上 不一樣任務間來回切換 單核就能夠實現併發,可是單核沒法實現並行 並行:真正意義上的同時運行,一個cpu同一時刻只能作一件事 只有多核才能同時作多件事,即並行的效果 串行:按照固定的順序一個個地執行(第一個任務沒執行完 第二個只能等待) 三、不一樣操做系統開啓子進程的區別 windows-CreateProcess unix-fork 都會拷貝父進程的狀態, 區別點是unix系統fork拷貝的子進程的初始狀態和父進程如出一轍. 進程的終止 windows-ExitProcess unix-exit 四、一個進程的三種運行狀態 運行態(正在執行)- 阻塞態(遇到IO)- 就緒態(運行時間過長/有優先級更高的搶走CPU) 只有運行態和就緒態能夠來回切換 阻塞態切換到運行態時 須要通過就緒態 二、開啓進程的兩種方式(*****) 1.直接實例化Process這個類 參數target中傳入任務函數 2.繼承Process類 實現run函數 方式一: from multiprocessing import Process import os,time def task(name): print('%s is running' %os.getpad()) if __name__ == '__main__': obj=Process(taget=task,args=('egon',)) obj.start() # 發送信號給操做系統 print('主') 方式二: from multiprocessing import Process import os,time class Work(Process): def run(self): print('%s is ruuning' %self.pid) time.sleep(3) if __name__ == '__main__': obj=Work() obj.start() # 發送信號給操做系統 print('主') (啓動進程的方式 1.系統初始化 會產生一個根進程 2.用戶的交互請求 鼠標雙擊某個程序 3.在一個進程中 發起了系統調用啓動了另外一個進程 ****** 4.批處理做業開始 某些專用計算機可能還在使用) 3.多進程的執行順序 ****** 主進程必然先執行 子進程應該在主進程執行後執行 一旦子進程啓動了 後續的順序就沒法控制了 四、進程對象的經常使用屬性 obj.start() 開啓進程 obj.join(1) 父進程等待子進程 obj.terminate() 終止進程 obj.is_alive() 是否存活 obj.pid 獲取進程id obj.name 進程名稱 "我是主程序個人pid:%s 個人父進程是:%s" % (os.getpid(),os.getppid()) "我有一個兒子是 %s" % obj.pid 5 殭屍進程和孤兒進程(瞭解)** 殭屍進程:有害 一個子進程任務執行完就死亡了 可是操做系統不會當即將其清理 爲的是 開啓這個子進程的父進程能夠訪問到這個子進程的信息(如PID) 這樣已完成任務的 可是沒有被操做系統清理的進程稱爲殭屍進程 直到父進程結束後發起調用回收子進程(減小PID佔用),殭屍進程越少越好 孤兒進程:無害! 沒有爹的稱爲孤兒 一個父進程已經死亡 然而他的子孫進程還在執行着 這時候操做系統會接管這些孤兒進程