1. 程式人生 > >python 常見面試題(web 後端)

python 常見面試題(web 後端)

此貼持續更新,歡迎大家前來補充

目錄

1、.socket,udp,tcp

2、程序、協程、執行緒

3、多執行緒在web專案中的應用

4、 Python2中range 和xrange的區別?

5、深拷貝淺拷貝

6、celery 


1、.socket,udp,tcp

socket(簡稱 套接字) 是程序間通訊一個工具,它能實現把資料從一方傳輸到另外一方,完成不同電腦上程序之間的通訊, 它好比資料的搬運工。


UDP是一個簡單的面向資料報的運輸層協議

優點:

  • 傳輸速度快(因為UDP在傳輸資料報前不用在客戶和伺服器之間建立一個連線,且沒有超時重發等機制)
  • 不需要連線,資源開銷小

缺點:

  • 傳輸資料不可靠,容易丟資料包
  • 沒有流量控制,當對方沒有及時接收資料,傳送方一直髮送資料會導致緩衝區資料滿了,電腦出現卡死情況,所有接收方需要及時接收資料。

UDP的使用場景:

當對網路通訊質量要求不高的時候,要求網路通訊速度能儘量的快,這時就可以使用UDP

  • qq音視訊傳輸,微信音視訊傳輸
  • 傳送廣播訊息

TCP:英文全拼(Transmission Control Protocol)簡稱傳輸控制協議,它是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議.

TCP的優缺點:

優點:

  • 可靠,穩定
  • 適合傳輸大量資料

缺點:

  • 傳輸速度慢
  • 佔用系統資源高

 TCP使用場景:

  • 瀏覽器
  • QQ檔案傳輸

TCP和UDP區別:

  1. TCP面向連線; UDP是不面向連線;
  2. TCP提供可靠的資料傳輸,也就是說,通過TCP連線傳送的資料,無差錯,不丟失,不重複,且按序到達;UDP不保證可靠的資料傳輸,容易出現丟包情況;
  3. TCP需要連線傳輸速度慢,UDP不需要連線傳輸速度快
  4. TCP不支援發廣播;UDP支援發廣播
  5. TCP對系統資源要求較多,UDP對系統資源要求較少。
  6. TCP適合傳送大量資料,UDP適合傳送少量資料
  7. TCP有流量控制,UDP沒有流量控制

2、程序、協程、執行緒

程序、執行緒、協程對比:

1. 功能對比

  • 程序,能夠完成多工,比如 在一臺電腦上能夠同時執行多個QQ
  • 執行緒,能夠完成多工,比如 一個QQ中的多個聊天視窗

2. 定義對比

  • 程序是系統進行資源分配基本單位,每啟動一個程序作業系統都需要為其分配執行資源。
  • 執行緒是執行程式中的一個執行分支,是CPU排程基本單位。(程序是作業系統資源分配的基本單位,執行緒是CPU排程的基本單位)
  • 協程:在不開闢執行緒的基礎上完成多工,也就是在單執行緒的情況下完成多工,多個任務按照一定順序交替執行

3. 關係對比

  • 執行緒是依附在程序裡面的,沒有程序就沒有執行緒
  • 一個程序預設提供一條執行緒,程序可以建立多個執行緒
  • 一個執行緒裡面可以有多個協程

4. 區別

  • 程序之間不共享全域性變數
  • 執行緒之間共享全域性變數,但是要注意資源競爭的問題,解決辦法: 互斥鎖或者執行緒同步
  • 建立程序的資源開銷要比建立執行緒的資源開銷要大
  • 程序是作業系統資源分配的基本單位,執行緒是CPU排程的基本單位
  • 執行緒不能夠獨立執行,必須依存在程序中
  • 多程序開發比單程序多執行緒開發穩定性要強
  • 多程序、多執行緒根據cpu核數不一樣可能是並行的,但是協程是在一個執行緒中 所以是併發

5、優缺點

多程序:

  • 優點:可以用多核
  • 缺點:資源開銷大

多執行緒:

  • 優點:資源開銷小
  • 缺點:不能使用多核

協程:

       協程切換任務資源很小,效率高

3、多執行緒在web專案中的應用

多執行緒一般使用在進行IO操作時

1、比如一個業務邏輯需要並行的操作幾個檔案的讀寫,還得是同步執行,不能非同步執行,這時候可以開啟多執行緒來讀寫這幾個檔案

2、檢視中需要請求多個第三方介面,仍然也是要求同步的,不能非同步,這時候也可以用多執行緒去並行請求多個第三方介面

3、比如在訂單系統中,訂單提交後就要修改商品的庫存、商品的銷量等這樣的操作

 

4、 Python2中range 和xrange的區別?

兩者用法相同,不同的是range返回的結果是一個列表,而xrange的結果是一個生成器,前者是
直接開闢一塊記憶體空間來儲存列表,後者是邊迴圈邊使用,只有使用時才會開闢記憶體空間,所以當列表
很長時,使用xrange效能要比range好。 

5、深拷貝淺拷貝

6、celery 

celery是基於Python實現的一個非同步任務的排程工具,同時還是一個任務佇列,主要用於處理耗時任務

原理:

Celery的由三部分組成,訊息中介軟體(message broker),任務執行單元(worker)和任務執行結果儲存(task result store)組成。

訊息中介軟體(message broker):是任務排程佇列,是一個獨立的服務,生產者把任務放入佇列中,worker從任務佇列中取出任務執行,Celery本身不提供訊息服務,所以要整合第三方佇列,推薦使用RabbitMQ、Redis作為訊息佇列。

任務執行單元(worker):它實時監控訊息佇列,獲取佇列中排程的任務並執行

任務結果儲存(task result store):用來儲存Worker執行的任務的結果,Celery支援以不同方式儲存任務的結果,包括AMQP, Redis,memcached, MongoDB,SQLAlchemy, Django ORM,Apache Cassandra, IronCache

為什麼使用訊息佇列

在高併發環境下,由於來不及同時處理,請求往往會發生堵塞,通過使用訊息佇列,我們可以非同步處理請求,從而緩解系統的壓力

適用場景

非同步任務處理:例如給註冊使用者傳送短訊息或者確認郵件任務。 大型任務:執行時間較長的任務,例如視訊和圖片處理,新增水印和轉碼等,需要執行任務時間長。 定時執行的任務:支援任務的定時執行和設定時間執行。例如效能壓測定時執行。

缺點:

系統可用性降低、系統複雜性提高、一致性問題

參考:https://blog.csdn.net/u014801403/article/details/80308353