python多線程是假的
❶ 為什麼說python沒有真正意義上的多線程
因為python解釋器同一個時間只能使用一個cpu,所以再多的線程還是使用同一個cpu
真正的多線程是充分利用多個cpu的計算能力的
❷ 為什麼有人說Python的多線程是雞肋
因為python的全局解釋器鎖的機制,
導致python的多線程並不是真正的多線程,
效率上不僅不會比單線程快,反而可能更慢,
所以說是雞肋,要求速度好話,可以用多進程來實現
❸ Python多線程是什麼意思
簡單地說就是作為可能是僅有的支持多線程的解釋型語言(perl的多線程是殘疾,PHP沒有多線程),Python的多線程是有compromise的,在任意時間只有一個Python解釋器在解釋Python bytecode。
UPDATE:如評論指出,Ruby也是有thread支持的,而且至少Ruby MRI是有GIL的。
如果你的代碼是CPU密集型,多個線程的代碼很有可能是線性執行的。所以這種情況下多線程是雞肋,效率可能還不如單線程因為有context switch
但是:如果你的代碼是IO密集型,多線程可以明顯提高效率。例如製作爬蟲(我就不明白為什麼Python總和爬蟲聯系在一起…不過也只想起來這個例子…),絕大多數時間爬蟲是在等待socket返回數據。這個時候C代碼里是有release GIL的,最終結果是某個線程等待IO的時候其他線程可以繼續執行。
反過來講:你就不應該用Python寫CPU密集型的代碼…效率擺在那裡…
如果確實需要在CPU密集型的代碼里用concurrent,就去用multiprocessing庫。這個庫是基於multi process實現了類multi thread的API介面,並且用pickle部分地實現了變數共享。
再加一條,如果你不知道你的代碼到底算CPU密集型還是IO密集型,教你個方法:
multiprocessing這個mole有一個mmy的sub mole,它是基於multithread實現了multiprocessing的API。
假設你使用的是multiprocessing的Pool,是使用多進程實現了concurrency
from multiprocessing import Pool
如果把這個代碼改成下面這樣,就變成多線程實現concurrency
from multiprocessing.mmy import Pool
兩種方式都跑一下,哪個速度快用哪個就行了。
UPDATE:
剛剛才發現concurrent.futures這個東西,包含ThreadPoolExecutor和ProcessPoolExecutor,可能比multiprocessing更簡單
❹ 為什麼有人說 Python 的多線程是雞肋
因為 Python 中臭名昭著的 GIL。
那麼 GIL 是什麼?為什麼會有 GIL?多線程真的是雞肋嗎? GIL 可以去掉嗎?帶著這些問題,我們一起往下看,同時需要你有一點點耐心。
多線程是不是雞肋,我們先做個實驗,實驗非常簡單,就是將數字 「1億」 遞減,減到 0 程序就終止,這個任務如果我們使用單線程來執行,完成時間會是多少?使用多線程又會是多少?show me the code
那麼把 GIL 去掉可行嗎?
還真有人這么干多,但是結果令人失望,在1999年Greg Stein 和Mark Hammond 兩位哥們就創建了一個去掉 GIL 的 Python 分支,在所有可變數據結構上把 GIL 替換為更為細粒度的鎖。然而,做過了基準測試之後,去掉GIL的 Python 在單線程條件下執行效率將近慢了2倍。
Python之父表示:基於以上的考慮,去掉GIL沒有太大的價值而不必花太多精力。
❺ python的多線程是真的多線程嗎
簡單地說就是作為可能是僅有的支持多線程的解釋型語言(perl的多線程是殘疾,PHP沒有多線程),Python的多線程是有compromise的,在任意時間只有一個Python解釋器在解釋Python bytecode。
UPDATE:如評論指出,Ruby也是有thread支持的,而且至少Ruby MRI是有GIL的。
如果你的代碼是CPU密集型,多個線程的代碼很有可能是線性執行的。所以這種情況下多線程是雞肋,效率可能還不如單線程因為有context switch
但是:如果你的代碼是IO密集型,多線程可以明顯提高效率。例如製作爬蟲(我就不明白為什麼Python總和爬蟲聯系在一起…不過也只想起來這個例子…),絕大多數時間爬蟲是在等待socket返回數據。這個時候C代碼里是有release GIL的,最終結果是某個線程等待IO的時候其他線程可以繼續執行。
反過來講:你就不應該用Python寫CPU密集型的代碼…效率擺在那裡…
如果確實需要在CPU密集型的代碼里用concurrent,就去用multiprocessing庫。這個庫是基於multi process實現了類multi thread的API介面,並且用pickle部分地實現了變數共享。
再加一條,如果你不知道你的代碼到底算CPU密集型還是IO密集型,教你個方法:
multiprocessing這個mole有一個mmy的sub mole,它是基於multithread實現了multiprocessing的API。
假設你使用的是multiprocessing的Pool,是使用多進程實現了concurrency
from multiprocessing import Pool
如果把這個代碼改成下面這樣,就變成多線程實現concurrency
from multiprocessing.mmy import Pool
兩種方式都跑一下,哪個速度快用哪個就行了。
UPDATE:
剛剛才發現concurrent.futures這個東西,包含ThreadPoolExecutor和ProcessPoolExecutor,可能比multiprocessing更簡單
❻ 為什麼有人說 Python 的多線程是雞肋呢
首先,我並不認同這個觀點,我覺得覺得Python 的多線程是雞肋多餘的人,應該還沒有完全使用過Python 的多線程功能,並沒有發掘它的潛在能力。
什麼是Python多線程
Python多線程最大的優點就是使用方便,很多時候我們並不需要做大量的密集型數據的處理運算,這時候用Python多線程是最方便快捷的,可以大大減少工作量、提高工作效率。
總結
從以上幾點我們就可以看出,Python多線程並不雞肋,只是有時候使用者在不巧當的地方使用,它自然不是那麼順手,我們加深熟悉了解Python多線程的適用范圍。
❼ python的多線程是假的嗎
對 是假的 有全局鎖
❽ python的多線程到底有沒有用
線程主要用於非同步操作。只要有非同步的IO,或者是非同步的操作,等待都可以用線程。
但是python的線程不足夠安全。同時它還有GIL的問題。線程的退出也不太容易。所以在python里經常用進程代替線程。但是如果並發內容太多,只能用多進程+多線程方式。
總體來講。只要用法正確。python的線程還是很可靠的。起動和完成幾萬次線程。一次不出錯,也是有可能的。
典型的用法是,在GUI後面,做一些後台操作;多線程網路操作;後台監控某個事件;隊列操作等 。
❾ py的多線程是偽線程嗎
這是一個很難回答的問題。倒不是因為技術問題,而是這個問題本身的很多含義很含糊。Python的線程有兩層意思。第一是對Python解釋器來說。這個沒問題,是真線程。Python的解釋器會管理它名下的線程,分配資源,並行運行。而Python的這些線程針對OS是否是多線程的?這個不是。Python的線程只能通過Python解釋器得到系統資源。而Python本身,是單線程模式的。因此Python的線程不可能是真的線程。第三個問題,既然Python的線程不是真線程,是否編程的時候要避免使用?這個,見仁見智。我個人的偏好是,不用。雖說多線程在某些情況下能簡化程序的設計,但是這種情況太少見了。
❿ 為什麼有人說 Python 的多線程是雞肋呢
由於python是一種解釋性腳本語言,因此運行過程中始終存在全局線程鎖。
簡單的來說就是在實際的運行過程中,python只能利用一個線程,因此python的多線程並不達到C語言多線程的性能。
建議使用多進程來代替多線程,但需要注意的是多進程最好不要涉及到例如文件操作的頻繁操作IO的功能。