復習之網絡編程
阿新 • • 發佈:2019-05-12
抽象 roc 遞歸 future wait 模擬 線程等待 基本 pool
‘‘‘
學習網絡編程 ---開發c/s架構的軟件
學習並發編程,前端,數據庫,框架 ---開發b/s架構的軟件
‘‘‘
‘‘‘
七層協議:應表會傳網數物
應用層:http/ftp
傳輸層:tcp,udp
計算機之間的通信是某一個具體的應用程序與另外一個應用程序之間的通信
端口port:唯一標識一臺計算機某一個基於網絡通信的應用程序 標識的就是應用程序
tcp面向流的協議,udp面向消息的協議
是基於端口工作的,端口範圍是0-65535
默認端口MySQL 3306
flask5000
django框架8000
redis數據庫默認6379
tcp:三次握手四次揮手
三次握手就是建立連接的過程,客戶端向服務端發送請求,服務端回復的時候附上自己的請求,最後客戶端回復請求,連接建立
四次揮手是斷開連接的過程客戶端向服務端發送斷開請求,服務端斷開請求並回復,然後自己向客戶端發送斷開的請求,客戶端回應斷開的請求
--中間服務端不直接回回復的原因是萬一自己還有任務沒有發送,想起來再次發送,所以斷開請求時4次
洪水攻擊:服務端大量處於建立連接的狀態,來不及處理客戶端的消息
星軌:扛得住明星出軌的流量訪問次數,就是接收請求的軟件很牛逼,多少個客戶來都可以承受,就是自己高並發很牛逼
udp 傳輸數據時候可能會出現丟包現象,但是傳輸速度快
網絡層:ip協議
1.規定了每一臺接入互聯網的計算機都有唯一的IP地址
2.ip地址特點:點分十進制
IPv4,ipv6
0.0.0.0-255.255.255.255
3.ip協議可以實現跨局域網傳輸
數據鏈路層:以太網協議
1.規定了二進制數據的分組方式
2.規定了只要是接入互聯網的計算機都必須有一塊網卡
每一塊網卡出廠都會被燒制上一個世界上唯一的一個mac地址
mac地址是由12位16進制數組成,前6位代表廠商地址,後6位代表的是流水線號
物理連接層:實現計算機之間的物理連接,傳輸的數據都是0101的二進制。
電信號的工作原理是:電只有高低電頻,01代表的就是高低電頻
小總結:ip唯一標識一臺接入互聯網的計算機
port 唯一標識一臺計算機上面的某一個應用程序
ip+port 唯一標識一臺接入互聯網的計算機上面的應用程序
mac地址:規定了接入互聯網的計算機都必須有一塊網卡,通常由16位12進制組成,前6位是廠商編號,後6位是流水線號
學習完了網絡編程基礎,就來學習socket套接字,通過這個,我們可以實現基本的網絡通信,最後可以自己實現一個c/s軟件的開發
了解socket套接字:是處於應用層額和網絡層之間的一個抽象的概念,目的就是將下面的硬件通過socket套接字應用與軟件上
分為客戶端和服務端,導入模塊socket,方法accept,recv,send,bind,connect,listen
建立通信,建立連接
通信循環:通信一次結束不好,最好多來幾次,所以來個循環
不能只和一個人建立連接,所以得多個連接,來個循環 弊端:一次只可以服務一個人,但是服務端是可以服務多個人的,所以
最好將通信和建立連接分開,各自幹各自的活
異常處理:基於tcp實現通信的話,因為tcp是面向流的協議,所以如果輸入為空就會報錯,所以要進行異常處理
tcp處理問題會出現粘包的問題,所以針對粘包的處理有下面的幾個問題
發送端:發送報頭,發送字典長度 ,發送真實內容
接收端:接收報頭,接收字典長度,解析字典, 收取真實數據
練習:tcp實現大文件上傳socket,struct,json
struct 打包成固定長度
tcp和udp的區別
tcp:類似打電話,接不到就會一直呼叫,所以會是一個安全的
udp類似發短信,不管有沒有收到都不管
‘‘‘
‘‘‘
並發編程
操作系統的發展史
多道技術:空間上的復用(多個程序公用一套硬件設備,是多道計數實現時間上的復用的基礎)
時間上的復用(單個CPU的電腦上啟用多個程序,CPU快速切換)
cpu切換:
一個任務占用時間過長/遇到io操作
並發:看起來像是同時運行的就是並發
並行:同一時刻同時運行的就是並行
進程:一個任務就是一個進程,占用內存空間,資源單位
線程:CPU的執行單位
協程:人為提出的可以實現單個協程執行任務不切換,具體操作就是gevent.spwan,自動監測io行為,所有的監測的話導入猴子monky
進程內容:
1.創建進程的兩種方式multiprocess.Process
繼承類Process
定義方法然後target=任務名
2.join方法:就是讓主線程等待子線程結束,將主進程和子進程變成串行,但是子線程還是並發
3.進程對象的其他方法:查看pid,每一個進程都有一個唯一的pid,current_process().pid==porcess().pid/os.getpid()
terminate()主動殺死子進程的操作
is_alive判斷子進程是否存活狀態
demarn=True 守護進程(子進程守護主進程),必須再子進程啟動之前守護
4.互斥鎖:保證數據的安全mutex.acquire/release 模擬搶票
5.進程間的通信ipc機制 queue put get get_nowait full empty
生產者消費者模型
生產者:產生數據
消費者:處理數據
解決供需不平衡的問題
進程池:current.future 為了計算機的壽命考慮,自己定義一個進程池固定一次執行多少的任務
current.future pool=Processpoolexature pool.submit(是一個future對象) future.result
回調函數 ---讓別的去執行任務
線程內容:
和進程的區別是進程只是開辟了內存空間,並不是一個具體的執行單位,如果要執行的話就得將代碼復制一份到內存,就會很耗時間
所以CPU並不執行進程,執行的都是線程
形象理解車間和流水線
進程是車間:提供資源 資源單位
線程是流水線:是CPU最小的執行單位
1.創建線程的兩種方式 threading.thread
1.自定義一個類,繼承Thread
2.定義方法然後target=任務名
2.線程的join 主線程等待子線程結束
3.守護線程:子線程監測主線程,定時發送消息告訴你主線程的近況,一旦主線程死掉,子線程就不再發送消息,也可以認為此時子線程也死了
但是主線要等到所有的子線程都結束才可以結束
4.線程對象的其他方法 查看線程名
GIL全局解釋器鎖 與普通鎖的區別 死鎖 遞歸鎖 信號量(多把鎖) event事件一個線程給另一個線程發消息
線程間通信queue 但是線程間信息是共享的
線程池:CPU執行的是線程,不能無限制的開線程,為了節省計算機壽命
current.future pool=threadpoolexature pool.submit(future對象) future.result
回調函數
協程:人為想出來的為了讓單個線程下的多個任務不間斷執行,實現並發(切換+保存狀態)
gevent.spwan spwan是一個擁有返回值的 spawn.join讓所有的線程都結束
復習之網絡編程