既然Python解釋器是單線程的,還有進行多線程編程的必要嗎?

龍江好好


CPython(標準的python實現)有一個名為GIL(全局解釋器鎖)的東西,它阻止兩個線程在同一個程序中同時執行。 有些人對此感到不安,而其他人則狠狠地為此辯護。 但是,有一些解決方法,像Numpy這樣的庫通過在C中運行外部代碼來繞過這個限制。

何時使用線程與進程?

  • 進程加速了CPU密集型的Python操作,因為它們受益於多個內核並避免使用GIL。

  • 線程最適合IO任務或涉及外部系統的任務,因為線程可以更有效地組合他們的工作。 進程需要挑選他們的結果來組合它們需要時間。

由於GIL,線程在python中沒有為CPU密集型任務提供任何好處。而對於像Dot Product這樣的某些操作,Numpy可以解決Python的GIL並且並行執行代碼。

I/O的多線程使用

應用程序的大部分時間都花在I/O上。無論是磁盤I/O還是網絡I/O。

例如,對於Web應用程序,大多數情況下是處理數據庫。因此,在大多數現代應用程序中,最大的瓶頸是I/O。以下是開啟4個線程後效果,實際上效果還是很顯著的。

這意味著應用程序大部分都在等待,因此即使python沒有GIL,也不是所有應用程序都會一直運行(使用cpu,因為它們將等待I/O完成)。

所以,在大多數應用程序線程在I / O上等待的情況下,其他線程可以獲取CPU,從而提高性能。如果python沒有多線程,那麼其他一些線程無法獲得cpu因此浪費時間。現在至少當一個線程正在等待I/O時(大部分應用程序都是這種情況),其餘的線程都可以工作,那麼多線程還是有它存在的必要,所以這就是我們沒有看到GIL所擁有問題的原因。

當然如果你的應用程序是CPU密集型的,那麼在python中確實沒有太多的線程可以提供使用。


我會在這裡發佈所有與科技、科學有關的有趣文章,歡迎訂閱我的頭條號。偶爾也回答有趣的問題,有問題可隨時在評論區回覆和討論。


楊沐白


先簡單的回答:有必要。

首先,線程消耗的是CPU資源

如果一個單線程內處理的業務邏輯會佔用100%的CPU資源,那麼,上了多線程也是沒有用的。

但這種情況很少,高CPU佔用一般出現在內存計算場景下,或者不良代碼中錯誤的死循環。 正常情況下,CPU佔用大於80%就需要進行代碼或設計的優化,或者服務器增加資源了。

多線程場景適用於解決慢速IO的問題

我們絕大部分的計算,都會依賴於很多外部資源IO,如磁盤讀寫、網絡訪問、數據庫訪問... 這些資源的訪問速度遠遠低於CPU的切換速度。如果使用單線程進行操作時,就會長時間的等待IO的返回。造成無效等待,性能低下。

所以即使是Python,為了充分利用CPU資源,提高性能,在通常的業務場景下使用多線程編程也是完全必要的。

多核與Python多實例

延續上面的問題,我們知道現在CPU大部分都是多核的,python為了避免單線程只能使用到一個核的問題,是有個multiprocessing 庫的,允許創建子進程(子進程數一般與核心數相同),來充分利用CPU資源。

↓ ↓ ↓ 喜歡就點贊吧,歡迎各位評論指教,謝謝關注 -- 極迭代


極迭代


python有個全局鎖,你不知道什麼是全局鎖你可以百度查一下,由於這個全局鎖的存在python的多線程其實就是個雞肋,所以,一般都用異步協程的方式來搞定高併發!


分享到:


相關文章: