為什麼有人說 Python 的多執行緒是雞肋呢?

時間 2021-05-07 03:28:27

1樓:

確實雞肋,主要原因是因為GIL。但執行緒依然很有用

很多人提到協程,如果沒有ThreadPoolExecutor很多任務只能阻塞eventloop。

編寫c模組的時候,還可以釋放GIL,跑滿多核也不難。這導致對很多科學計算的任務其實用threadpool都能突破GIL限制。

2樓:

CPython直譯器並不是執行緒安全的,有GIL(全域性直譯器鎖)保護直譯器,任何時候都只有乙個python執行緒執行,所以並不能同時使用多核

因此GIL只會影響那些嚴重依賴CPU的程式(CPU密集型的計算)。

至於IO密集型,例如爬蟲,檔案讀寫等,python的多執行緒是可以完全支援的,因為標準庫中所有執行阻塞型IO的函式,在等待作業系統返回結果時都會釋放GIL,此時允許再開乙個執行緒執行,大大提公升了執行程式的效率,但同一時刻還是只有乙個執行緒,所以說是雞肋。

3樓:Cyandev

Python 不適合開發 CPU 密集型的程式,GIL的作用通俗來講就是,同一時刻乙個解釋程序只有一行bytecode在執行,那 Python 多執行緒的意義就是能讓每條語句巨集觀上併發執行,而並不代表能提公升總體的執行效率,執行時間總和是不減反增的,畢竟多了上下文切換。

當然了,對於 IO 密集型的程式,Python 多執行緒還是有很大作用的。然而 Python 3 引入的 asyncio 模組使得很多 IO 操作有了更好的方式去解決,這就非常類似 Node.js 了,都是沒有多執行緒,而是採用 Event Loop 來處理耗時的 IO 操作。

4樓:

不能做到並行,但可以做到併發。

對於計算密集型應用,python的多執行緒確實沒啥用。

但對於向網頁提交多個request這種IO密集型應用,併發就很有用了。

5樓:find goo

多執行緒還是有用的,多程序有多程序的好處,多執行緒有多執行緒的好處。

多程序穩定,啟動時開銷大點,但如果你的執行時間遠大於多程序的時間,用多程序比較方便,如postgresql用多程序,chrome 多程序。

如果你只是想做個定時器樣的簡單東西,對穩定性要求低些,如vb,c#類似的定時器,用多執行緒吧,但執行緒的同步要注意了。python的執行緒更加類似定時器,python的執行緒不是真執行緒,但有的場合用這種定時器也能解決很多問題,因為開銷小,開啟也方便。

程序和執行緒,乙個是重量級的,乙個輕量級的,重量級的程序有保護區,程序上下文都是作業系統保護的,而執行緒是自己管理,需要一定的技術,不能保證在併發時的穩定性(多程序也不穩定,但很容易看出來,因為多出了程序容易發現),而python的更像是定時器,定時器有時也可以模擬線程,定時器多時的開銷比執行緒的開銷要小,真執行緒有下上文開銷,乙個作業系統啟動多程序和多執行緒會達到切換飽和是有數量的,真執行緒或程序太多都會導致cpu佔用率居高不下,而定時器可以開n多。

很多東西不是一種比另外一種先進,而是一種互補的關係,計算機的計算單位切換有優點必有缺點,關鍵在找到合適的使用方式揚長避短。

6樓:阿焦

我覺得為什麼在Python裡推薦使用多程序而不是多執行緒?這篇文章解釋的很清楚,主要還是Python本身的GIL機制帶來的問題。

7樓:

因為Python的多執行緒不能呼叫多個核心,只能利用乙個核心. 如果是IO密集帶阻塞的任務,Python的多執行緒還是很不錯的. 如果是CPU密集, 試試多程序好了.

試一試這個多程序:

8樓:

個人看法,執行緒本身就是乙個有些複雜甚至可以說有些醜陋的解決方案,95%的情況下其實都可以不用——KISS。

如果要用併發處理,基本上使用非阻塞多路復用+多程序方式,就可以處理絕大多數需求了

9樓:

對於計算密集型的任務,多執行緒是雞肋,不如用多程序,但是對於IO密集型的任務,多執行緒並不是雞肋,因為網路IO的延遲比CPU的更大。

10樓:

@yegle 說的大部分都是對的。

唯有併發 I/O 的一部分…… 為什麼會有「執行緒是為不懂狀態機的程式設計師準備的」這種說法?在單核的計算機上程式設計根本不需要使用多執行緒程式設計嗎? 這個問題已經說了我想說的了。

併發 I/O 的情況請善用 Tornado / Gevent 這種基於庫,每 CPU 核心起乙個程序跑乙個 event loop;除非請求的處理時間遠大於 I/O 和 job scheduling 的時間,這種情況實際上也應該通過 MQ 往多機上發布任務了。

11樓:姚鋼強

一般大部分的觀點是由於有 GIL 的存在,Python 中的多執行緒不能真正的利用多核,不能解決 cpu bound 的問題,但是在一些 IO bound 的程式上卻可以有很好的提公升。

但是目前的情況是我們有了協程啊,在 2.x 系列裡我們可以使用 gevent 啊,在 3.x 系列的標準庫里又有了 asyncio 。

IO bound 的問題完全可以用協程解決。而且我們可以自主的控制協程的排程了。為什麼還要使用由 OS 排程的不太可控的執行緒呢?

所以我認為執行緒在 Python 裡就是個雞肋。尤其實在 3.x 系列裡。

還有乙個介紹 2012 不宜進入的三個技術點(中)

為什麼有人說「櫃子多,甲醛也多」?

作精貓不睡覺 甲醛可以說在裝修中無處不在,就櫃子而言,每一塊木板本身的加工和縫邊中都含有甲醛 還有各種補縫固定用到的膠 用的材料越多 甲醛含量自然就越高了 胡大蠻 大家在裝修的時候,板材,牆面,家具,地毯,窗簾等,其實都可以選擇環保型材料的,這些東西單個拎出來甲醛濃度都是較低的,但是裝修的時候,這些...

python中為什麼說元組不可改變?

狼大人 如果問的是 為什麼有了 List 還要不可修改的 Tuple 的話,有一些地方是必須使用不能修改的型別的,比如 Dict 的 key,或者 set 元素。本身不管是 hash 還是 tree,你直接做了 inplace 修改的話,整個表結構都是被破壞的。這個時候就不能用 List,而必須用 ...

為什麼說 Python 是強型別語言?

Python Jack 強弱只是相對的乙個概念,我覺得區分動態型別和靜態型別對理解程式語言更為關鍵,如果要區分強弱,必須上公升到哲學的高度,而且這個並沒有特別實際的意義。舉個例子,你很有可能認為三角形的內角和理所當然的應該是180度,其實這只是因為你學習的幾何學是歐氏幾何學,如果你了解過羅巴切夫斯基...