深拷貝
1.對象A拷貝,生成對象B,且我們修改對象B(對象A)中的數據或方法,對象A(對象B)不會受影響,這就是深拷貝
2.對于可變與不可變類型
對于不可變類型,深拷貝會和淺拷貝一樣,拷貝的是引用,不會創建新的內存地址
對于可變類型,深拷貝會拷貝每一層,新建內存地址進行儲存
淺拷貝
1.對象A拷貝,生成對象B,且我們修改對象B(對象A)中的數據或方法,對象A(對象B)會受影響,這就是淺拷貝
2.(淺拷貝是對一個對象父級(最外層)的拷貝,并不會拷貝子級(內部))
對于不可變類型,淺拷貝僅僅是地址指向,不會開辟新空間
對于可變類型,淺拷貝只是引用原數據,會跟著原數據的改變而改變
可變與不可變數據類型
可變數據類型 :可以在原數據的基礎上進行修改,修改后內存地址不變
常見的可變類型
列表(list)、字典(dictionary)、集合 (set)
不可變數據類型:不能在原數據基礎上進行修改,重新賦值后內存地址改變
常見的不可變類型
字符串(str)、數字(number)、元組 (tuple)
垃圾回收機制
引用計數
當一個對象的引用被創建時,對象的引用計數加1,當一個對象的引用被移除時,對象的引用就是減1,當對象的引用計數為0時,就意味著對象已經不再被使用,可以將其內存釋放掉
標記清除
標記清除 是 建立在引用計數技術基礎之上
當引用計數為0的時候就給這個對象打上一個標簽”可清除“,但是不會立馬清除,而是會等到系統給程序分配的內存要用完之時,停下來將可清除標簽的對象銷毀然后繼續。
分代回收
分代回收 是 建立在標記清除技術基礎之上
分代回收共分為三個“代”:年輕代、中年代、老年代,他們對應的是3個鏈表,它們的垃圾收集頻率與對象的存活時間的增大而減小
新創建的對象都會分配在年輕代,年輕代鏈表的總數達到上限時,Python垃圾收集機制就會被觸發,把那些可以被回收的對象回收掉,而那些不會回收的對象就會被移到中年代去,
當中年代鏈表的總數達到上限時,Python垃圾收集機制就會被觸發,把那些可以被回收的對象回收掉,而那些不會回收的對象就會被移到老年代去,
依此類推,老年代中的對象是存活時間最久的對象,甚至是存活于整個系統的生命周期內
同時,分代回收是建立在標記清除技術基礎之上。分代回收同樣作為Python的輔助垃圾收集技術處理那些容器對象.
TCP/UDP
TCP
TCP 文件的上傳下載(發送郵件、網盤、緩存電影)
1. 可靠、慢、全雙工通信
2. 建立連接的時候 : 三次握手
3. 斷開連接的時候 : 四次揮手
4. 在建立起連接之后
- 發送的每一條信息都有回執 *
- 為了保證數據的完整性,還有重傳機制
5. 長連接 :會一直占用雙方的端口
6. IO(input,output)操作,輸入和輸出是相對內存來說的
- write / send -----> 輸出output
- read / recv ------> 輸入input
7. 能夠傳遞的數據長度幾乎沒有限制
TCP三次握手
TCP三次握手
第一次握手:建立連接時,客戶端發送SYN包到服務端,并進入SYN_SENT狀態,等待服務器確認。
SYN:同步序列編號
第二次握手:服務器收到SYN包,必須確認客戶的SYN包,同時自己也發送一個SYN包,即SYN+ACK包,此時服務器進入SYN_RECV狀態
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入,ESTABLISHED(TCP連接成功)狀態,完成三次握手。
TCP四次揮手
第一次揮手:首先客戶端向服務端發送斷開請求
(客戶端發送一個FIN,用來關閉客戶端到服務器的數據傳送,然后等待服務器的確認。其中終止標志位FIN=1,序列號seq=u)
第二次揮手:服務端向客戶端進行回復
(服務器收到這個FIN,它發送一個ACK,確認ack為收到的序號加一)
第三次揮手:服務端向客戶端斷開請求
(關閉服務器到客戶端的連接,發送一個FIN給客戶端)
第四次揮手:客戶端收到消息后進行回復
(客戶端收到FIN后,并發回一個ACK報文確認,并將確認序號seq設置為收到序號加一。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉)
UDP
- 1.無連接的 速度快
- 2.可能會丟消息
- 3.能夠傳遞的數據的長度是有限的,是根據數據傳遞設備的設置有關系
UDP 即時通信類的(qq、微信、飛秋)
TCP/UDP的區別和優缺點
UDP是面向無線連接的通訊協議,UDP數據包括目標端口和源端口信合
優點:UDP傳遞速度快、操作簡單、系統資源占用較少,由于通訊不需要連接,可以實現廣播發送
缺點:UDP傳輸數據前并不與對方建立連接,對接受的數據不用發送確認信號,發送端不清楚數據是否成功發送,也不會重復發送,不可靠
TCP是面向連接的通訊協議,通過三次握手建立連接,通訊完成時四次揮手,關閉連接
優點:TCP在數據傳遞時,有確認、窗口、重傳、阻塞等等控制機制,能保證數據正確性,較為可靠
缺點:TCP相對于UDP速度慢一些,對系統資源占用較多
HTTP發送請求的流程
1.1 瀏覽器根據域名解析IP地址
1.2 瀏覽器與WEB服務器建立一個TCP連接
TCP的3次握手。
1.3 瀏覽器給WEB服務器發送一個HTTP請求
一個HTTP請求報文由請求行(request line)、請求頭部(headers)、空行(blank line)和請求數據(request body)4個部分組成。其中有get和post請求 說一下兩個請求的應用場景
1.4 服務器端響應HTTP請求,瀏覽器得到HTML代碼
1.5 瀏覽器解析HTML代碼,并請求HTML代碼中的資源
1.6 關閉TCP連接,瀏覽器對頁面進行渲染呈現給用戶
HTTP常見的狀態碼
1. 100-199:表示服務器成功接收部分請求,要求客戶端繼續提交其余請求能完成整個處理過程。
2. 200-299:表示服務器成功接收請求并已經完成處理,常用200(ok請求成功)。
3. 300-399:為完成請求,客戶需要進一步細化請求,例如:302(所有請求頁面已經臨時轉移新的url),304,307(使用緩存資源)。
4. 400-599:服務器出現錯誤,常用500(請求未完成,服務器內部遇到不可預知的錯誤)
HTTP常見的請求頭
1. Host(主機和端口號)
2. Connection(連接類型)
3. Upgrade-Insecure-Requests(升級為HTTPS請求)
4. User-Agent(瀏覽器名稱)
5. Accept(傳輸文件類型)
6. Referer(頁面跳轉處)
7. Accpet-Encoding(文件編解碼格式)
8. Cookie(Cookie)
9. x-requested-with:XMLHttpRequest(Ajax異步請求)
如何解決HTTP黏包問題
重新在寫一個http協議就行
工作中常用到的python第三方庫有哪些 還有一些包
re os sys json
進程線程協成
進程
進程是資源分配的最小單位
進程之間數據不共享 ,所以需要進程通信
通信的三種方式
1. 進程隊列queue
2. 管道pipe
3. 共享數據manage
進程池
開多進程是為了并發,通常有幾個cpu核心就開幾個進程,但是進程開多了會影響效率,主要體現在切換的開銷,所以引入進程池限制進程的數量。
這時候就用到了進程池,進程池內部維護一個進程序列,當使用時,則去進程池中獲取一個進程,如果進程池序列中沒有可供使用的進進程,那么程序就會等待,直到進程池中有可用進程為止。
線程
1. 線程是操作系統能夠進行運算調度的最小單位
2. 線程是包含在進程中的
3. 進程自己是無法執行的,是靠線程進行執行的
線程池
1. 系統啟動一個新線程的成本是比較高的,因為它涉及與操作系統的交互。在這種情形下,使用線程池可以很好地提升性能,尤其是當程序中需要創建大量生存期很短暫的線程時,更應該考慮使用線程池。
2. 線程池在系統啟動時即創建大量空閑的線程,程序只要將一個函數提交給線程池,線程池就會啟動一個空閑的線程來執行它。當該函數執行結束后,該線程并不會死亡,而是再次返回到線程池中變成空閑狀態,等待執行下一個函數。
協成
什么是協程
1. 協程是微線程
2. 協程擁有自己的寄存器上下文和棧
3. 協程能保留上一次調用時的狀態
為什么能處理并發
1. 遇IO組自動切換
2. 內部封裝的有Greenlet模塊(遇到IO手動切換) 和 Gevent模塊(遇到IO自動切換)
Greenlet
遇IO操作 手動切換
Gevent
Gevent 是一個第三方庫,可以輕松通過gevent實現并發同步或異步編程
其實Gevent模塊僅僅是對greenlet的再封裝,將I/O間的手動切換變成自動切換
Gevent原理是只要遇到I/O操作就會自動切換到下一個協程
迭代器、生成器、裝飾器
裝飾器應用場景
1. 引入日志
2. 函數執行時間統計
3. 執行函數前預備處理
4. 執行函數后清理功能
5. 權限校驗等場景
6. 緩存
7. 事務處理
裝飾器必須準尋的原則
1. 不修改被裝飾器的函數的源代碼
2. 不修改裝飾器函數的調用方式
3. 在滿足前者條件的情況下增加額外的功能
靜態方法,類方法,屬性方法,魔法方法
1.靜態方法需要修飾器@staticmethod來標識,告訴解釋器這是一個靜態方法
特性: 靜態方法只是名義上歸類管理,實際上在靜態方法里訪問不了類或則實例中的任何屬性
2.類方法需要修飾器@classmethod來標識,告訴解釋器這是一個類方法
作用:無需實例化直接被類調用
特性: 類方法只能訪問類變量,不能訪問實例變量
3.屬性方法需要修飾器@property來標識,告訴解釋器這是一個屬性方法
4.__ doc __ 表示類的描述信息
__ call __ 對象后面加括號,觸發執行
__ str __ 如果一個類中定義了__ str __方法,在打印對象時,默認輸出該方法的返回值
__ dict __ 查看類或對象中的所有成員
new和init的區別
1、 new是一個靜態方法,而init是一個實例方法.
2、 new方法會返回一個創建的實例,而init什么都不返回.
3、 只有在new返回一個cls的實例時后面的init才能被調用.
4、 當創建一個新實例時調用new,初始化一個實例時用init.