python處理併發導讀與目錄

        在閱讀Python處理併發的系列文章前,正確區分 進程/線程、並行/併發、阻塞/非阻塞、同步/異步 概念非常重要,是學習本部分內容的基礎,也是面試中經常會被問到的內容。

一. 概念區分

1.1 進程和線程

        一個正在運行的程序在操作系統中被視爲一個進程,進程可以包括一個或多個線程。其中,線程是操作系統分配處理器時間片的最小單位。進程間是相互獨立的,一個進程無法訪問另一個進程的數據,一個進程的失敗也不影響其他進程的運行;進程間通信需要依賴管道、隊列、信號量等技術。

        線程是進程中的基本執行單元,是操作系統分配CPU時間的基本單位,一個進程可以包含多個線程,多個線程共享主線程的資源,在進程開始執行的第一個線程被視爲主線程。

        進程和線程在使用時需要注意的地方:

  • python多線程適合做io密集型程序,因爲當一個線程遇到I/O操作時,將釋放GIL(全局解釋器鎖),因此效率更高。如果是計算密集型程序,python中單線程因爲沒有線程切換的延時,效率將高於多線程。
  • 對於計算密集型程序,一般使用多進程,多進程可以發揮多核cpu。計算密集型程序來說,多進程效率 > 單線程 > 多線程。
  • GIL在較長一段時間內將會繼續存在,但是會不斷對其進行改進;不過可以使用multiprocessing替代Thread,或者使用協程,協程適合IO密集型,只用單核。
  • IO密集型:涉及到網絡、磁盤IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因爲IO的速度遠遠低於CPU和內存的速度)。常見的大部分任務都是IO密集型任務,比如Web應用。
  • 計算密集型:特點是要進行大量的計算,消耗CPU資源,比如計算圓周率、對視頻進行高清解碼等等,全靠CPU的運算能力。這種計算密集型任務雖然也可以用多任務完成,但是任務越多,花在任務切換的時間就越多,CPU執行任務的效率就越低,所以,要最高效地利用CPU,計算密集型任務同時進行的數量應當等於CPU的核心數。

1.2 同步和異步

        同步是指發出一個任務調用時,必須等待任務執行完畢,才能返回或繼續執行後續操作。即,同步就是必須等一件事情做完了之後才能去做下面一件。

        異步與同步相對,調用者發出一個異步調用後,無需等待調用的結果,可以繼續執行後續的操作。當異步調用完成後,使用狀態、通知或對調來通知調用者(狀態:調用者需要輪詢異步調用的執行狀態,效率低;通知:異步調用完成後,發送通知給調用者,性能高;回調:類似於通知,當異步調用完成後,會調用調用者提供的回調函數)。

        總之,同步和異步的區別在於,調用發出後,是否需要等待結果,才能繼續執行後續操作。

1.3 阻塞和非阻塞

        阻塞和非阻塞並不是由同步和異步決定的,描述的是程序在等待調用結果(消息、返回值)時的狀態。阻塞是指調用結果返回之前,當前線程被掛起,線程只有在得到結果後纔會返回。非阻塞是指即便不能立即得到結果,當前線程也不會被掛起。(注:同步一般會伴隨阻塞,但也有可能沒有阻塞;異步執行也有可能阻塞,也可能沒有阻塞,總之,二者並無直接關係。)

1.4 並行和併發

       併發並不是並行,真正的並行需要多個核心。現在的筆記本電腦有4個CPU核心,但是通常不經意間就會有超過100個進程在運行。因此,實際上大多數程序都是併發處理的,而不是並行處理。計算機始終運行着100多個進程,確保每個進程都有機會取得進展,不過CPU本身同時做的事情不能超過4件。10多年前的設備也能併發處理100多個進程,不過都在同一個核心裏。

       並行:當一個CPU執行一個線程時,另一個CPU同時在執行另一個線程,兩個線程互不搶佔CPU資源,是真正意義上的同時進行。因此,並行的數量取決於CPU內核的數量。

       併發:當多個線程在操作時,如果系統只有一個CPU,則它根本不可能同時運行一個以上的線程,它只能把CPU運行時間或分成多個時間片,在將時間片分配給線程執行。在一個時間片的線程代碼在運行時,其它線程處於掛起狀態,這種方式稱之爲併發。

二. 目錄結構

python實現多進程(一) https://blog.csdn.net/Geroge_lmx/article/details/81176878  

python實現多進程(二) https://blog.csdn.net/Geroge_lmx/article/details/81838314

python實現多進程(三) https://blog.csdn.net/Geroge_lmx/article/details/81842829

python實現多線程(一) https://blog.csdn.net/Geroge_lmx/article/details/82049796

python實現多線程(二) https://blog.csdn.net/Geroge_lmx/article/details/82050009

python實現多線程(三) https://blog.csdn.net/Geroge_lmx/article/details/82082511

python實現IO多路複用(四) https://blog.csdn.net/Geroge_lmx/article/details/81160562

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