當前位置:首頁 » 編程語言 » python多線程是假的

python多線程是假的

發布時間: 2022-05-24 17:58:47

❶ 為什麼說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的功能。

熱點內容
李宗瑞文件夾 發布:2025-02-13 04:27:59 瀏覽:608
phpparent的parent 發布:2025-02-13 04:18:08 瀏覽:450
小容量存儲器市場 發布:2025-02-13 04:01:11 瀏覽:370
ickeck文件夾 發布:2025-02-13 04:00:21 瀏覽:639
上傳照片文案 發布:2025-02-13 03:53:13 瀏覽:425
電腦版花雨庭怎麼調中文伺服器 發布:2025-02-13 03:32:35 瀏覽:37
linux開發android 發布:2025-02-13 03:32:34 瀏覽:486
查詢重復欄位的sql語句 發布:2025-02-13 03:12:42 瀏覽:323
8uftp上傳網站 發布:2025-02-13 03:01:57 瀏覽:243
電腦玩游戲如何配置電源 發布:2025-02-13 03:01:53 瀏覽:362