[Python]並發編程的三種方式

1.多進程(Process)
2.多線程(Thread)
3.多協程(Coroutine)

Table of Contents

<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="顯示/隱藏內容目錄"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span>

1.什麼是CPU密集型計算、IO密集型計算?

bound在這邊是限制的意思。

CPU密集型(CPU-bound):
CPU密集型也叫計算密集型,指的是I/O在很短的時間就可以完成,CPU需要大量的計算和處理。特點是CPU占用率極高。
例如:壓縮/解壓縮、加密/解密、正則表達式搜索。

IO密集型(I/O-bound):
指的是系統運作大部分的狀況CPU在等I/O的讀寫。CPU占用率相對的會較低。
例如:文件處理、爬蟲網路、讀寫數據庫。

小總結:

若程式依賴大量的外部連結(內存、硬碟、網路、DB..等等外部連結)就是IO密集型。若其他的只在CPU運算,則是CPU密集型。

2.多進程、多線程、多協程的對比

這三個是有一個級聯關係的。一個進程中可以包含和啟動多個線程,一個線程中可以啟動多個協程。
協程的概念比較新,在任務中可以啟動很多的協程,但本身都在一個線程中進行。

多進程Process(multiprocessing)

  • 優點:可以利用多核CPU並行運算
  • 缺點:占用資源最多,可啟動數目比線程少
  • 適用於:CPU密集型計算

多線程Thread(threading)

  • 優點:相比進程,更輕量級,占用的資源更少。
    這裡的資源指的是每個線程運行都要包含自己的一些變量存儲,存儲到內存區域
  • 缺點:
    相比進程:多線程只能併發執行,不能利用多CPU(GIL-全局解釋器鎖)
    相比協程:啟動數目有限制,佔用內存資源,有線程切換開銷
  • 適用於:IO密集型計算、同時運型的任務數木要求不多

多協程Coroutine(asycio) – 異步io

  • 優點:內存開銷最少,啟動協程數量最多(甚至到幾萬個)。
  • 缺點:支持的庫有限制(aiohttp vs requests)、代碼實現複雜。
    目前有很多技術是不支持協程的,例如requests這個爬蟲常用的類庫,但在python協程中是不支持的,
    所以要用協程來進行爬蟲的話,可以用aiohttp。
    相比進程、線程,代碼實現複雜,且要考慮的點也較多。
  • 適用於:IO密集型計算、需要超多任務運行、但有現成庫支持的場景。

3. 如何根據任務選擇對應的技術?

來源:youtube
蚂蚁学Python【Python并发编程】怎样选择多线程多进程多协程