【python web開發知識點整理10】-協程

協程

1.什麼是協程?常用的協程模塊有哪些?協程和線程的區別?

協程是一種用戶級的輕量型線程,協程是由用戶程序自己控制調度,是單線程下的併發,又稱微線程,纖程,coroutine

常用模塊:

greenlet:提供了切換任務的快捷方式,但是遇到io無法自動切換任務,需要手動切換

gevent:開啓協程任務並切換的模塊,遇到io自動切換任務。

2.協程的join使用來做什麼的?它是如何發揮作用的?

阻塞等待調用join方法的協程任務執行完畢,然後繼續往後執行。

join產生阻塞,gevent識別到阻塞後,自動切換任務,只要該協程任務沒有完成,join會一直產生阻塞,從而使gevent不停的切換到該協程任務上執行。

3.使用協程實現併發的tcp server端

協程實現併發server

4.在一個列表中有多個url,請使用協程訪問所有url,將對應的網頁內容寫入文件保存

協程訪問url

1.簡述進程、線程、協程的區別以及應用場景?

進程:操作系統資源分配的最小單位,進程之間資源和地址空間獨立,進程的創建、銷燬、切換開銷大,可以利用多核。高密集型計算。

線程:進程中的一條執行過程,操作系統執行的最小單位,共享當前進程的資源,創建、銷燬、切換開銷比進程小。單存計算模型

協程:基於用戶級別控制的,線程中可以自由切換任務,無需操作系統調度,創建比線程更高效。爬蟲數據處理。

2.進程池、線程池的優勢和特點

開啓一定數量的進程/線程不停輪流處理大量的任務,避免了不停開啓/銷燬線程/進程過程中的開銷,從而提高處理任務的效率。

特點:只要有任務未處理完,進程池/線程池會自動開啓進程/線程處理任務,知道池中進程/線程數量達到限制。每個進程/線程處理完任務,無需銷燬,而是從新指令其他未完成的任務。

3.線程和協程的異同?

1.線程的開啓、切換、銷燬需要通過操作系統執行,協程的創建、切換、銷燬是基於程序員自己控制。
2.協程的切換效率遠高於線程的切換
3.協程本質上就是一個線程,所以也無法利用多核。
4.協程是數據安全的,但是線程數據不安全

4.請簡述一下互斥鎖和遞歸鎖的異同?

不同點:互斥鎖不能連續acquire,連續acquire會產生死鎖現象;遞歸鎖可以連續的acquire。
相同點:互斥鎖和遞歸鎖都可以保證同一段代碼在同一時間只有一個線程執行。

5.請列舉一個python中數據安全的數據類型?

隊列,隊列內部自動實現了鎖的機制,同一時間只有能一個對象對隊列中的元素修改

6、Python中如何使用線程池和進程池

使用concurrent.futures模塊中的ProcessPoolExecutor類和ThreadPoolExecutor類,創建進程池和線程池。

p = ProcessPoolExecutor(maxsize)獲得進程池對象
t = ThreadPoolExecutor(maxsize)獲得線程池對象
使用submit向池中添加任務,獲得一個任務對象
對任務對象使用result獲取任務的返回值

7.什麼是並行,什麼是併發?

並行:多個程序在同一時刻使用多個cpu處理任務,是真正的同時運行
併發:多個程序交替在一個cpu上處理任務,看起來像同時運行

8.請解釋同步和異步的概念

同步:發起一個任務,原地等待該任務執行結束返回結果,才繼續執行後續代碼。
異步:發起一個任務,不等待該任務執行結束,就直接執行後續代碼。

9.請談談對異步非阻塞的瞭解?

異步非阻塞,執行效率最高的模式,發起任務,不等待結果,直接執行自己的任務,任務在執行過程中沒有阻塞操作,充分提高了CPU的計算效率。

10.簡述信號量的實現原理?

sem = semaphore(5) 獲得一個信號量對象
同一可以允許一定數量的進程/線程執行某一段代碼,之後的進程/線程需要等待其中任務釋放掉信號量鎖,才能獲取鎖,執行該段代碼。

11.程序中的阻塞有哪些?給程序帶來了什麼影響?

一切io操作即向內存中寫入和從內存中取出,如讀取文件,寫入文件,獲取用戶數據,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章