Python 不能利用多核的問題以後能被解決嗎?

時間 2021-05-30 06:34:42

1樓:ramwin

上次幫人處理很多資料,我4核的電腦,開了4個terminal,同時執行指令碼。業務上的處理和分配應該可以解決這個問題的吧。

2樓:冒泡

首先這事就是乙個誤傳,確切說是「python的官方標準實現cpython的版本採用GIL,在邏輯上同一時刻只有乙個執行緒執行」

第一,這不是py的規定,而是cpython的乙個實現選擇,比如其他實現,jython之類就沒GIL的問題

第二,GIL只是規定邏輯上的同一時刻有乙個執行緒執行,但下層多執行緒還是對應os的執行緒,並非很多人謠傳的py是在vm模擬多執行緒,而且很多C擴充套件庫都在必要的時候釋放GIL以提高執行緒的併發性,儘管非常有限,但是用來解決阻塞IO併發肯定是沒問題

其次,GIL在cpython中被選擇,主要根源在於GC方式(參考RednaxelaFX的相關回答),另乙個重要原因是簡化C擴充套件庫的開發

再次,很多人覺得不能利用多核,效率就低,但事實上就算有去除GIL的版本並且解決了細粒度鎖的問題,然後你弄個48核伺服器並都佔滿,很多情況下也只能提公升一二十倍速度而已(因為有執行緒互斥的互動),而這個提公升用jit也能達到,如果用C擴充套件重寫核心模組,提速更多,花大力氣弄掉GIL根本划不來,何況在不改變GC機制和相容現有擴充套件庫的前提下,能不能做都是個問題

3樓:瀟灑哥

我想說,pypy2.5.1已經出了stm版本了,已經去除了gil,我在上面跑twited的多執行緒,cpu 8核心平均分配

4樓:pipi shaou

multiprocessing已經能榨出大量的多核效能了,我測試過,使用threading只能占用乙個核,使用multiprocessing,有多少核都能占光。程序間通訊,我的處理是減到最低程度,寧可多佔點記憶體,能不用就不用。

5樓:面試專家邁克

python和ruby等指令碼語言的出身限制了他們的適用範圍,現在這兩種語言常用的parallelism and concurrency的解決方案就是多程序。

真正要利用好多核還是需要Haskell和Erlang。

6樓:解靈運

是想問會不會移除GIL吧,目前沒有這個計畫,看現在python開發者的態度,以後也不會解決.使不使用GIL涉及到方方面面的問題,python現在選的方向就是使用GIL,現在python的思路是利用多核的時候使用多程序.

7樓:yishen chen

鑽牛角尖回答一下這其實是實現的問題跟語言沒關係 GIL是CPython的 JPython 和 IronPython 都沒GIL, 可以利用多核 PyPy貌似也可以移除GIL

8樓:

同意梁智的答案。

如果有多核,那應該是要追求大併發,高吞吐量。

這時候python還是洗洗睡吧。

當然這個世界上總是有些很奇葩的技術。

例如用C#寫的作業系統。

SharpOS (operating system)乙個技術費了很大功夫去實現了別的技術輕而易舉就可以完成的事情。

不是一件值得高興和稱讚的事情。

工具是用來解決問題的,不是製造問題。

9樓:陳磊

python 源於unix,而unix那時候沒有執行緒的概念,而他用的是程序。只要在初期初始化好程序池,速度也不會比執行緒慢多少,當然這就利用了多核,因為unix可以利用多核。有時候,需要扎根系統。

10樓:Kenneth

這是乙個好問題。由於GIL的限制cPython無法簡單充分利用多核處理器的並行處理能力,而使用multiprocessing之類的多程序方式,在程序間通訊上會耗費額外多的開銷,也達不到多執行緒應有的效率。

另一方面看來,目前python在大資料量高併發度方面的瓶頸並不是很明顯,python通常用於處理輕量級的任務。在我工作中使用python處理上T級別的自然語料庫的時候,也是依託於mapreduce平台,所以大資料處理中不能多執行緒實際上也並不是乙個很明顯的問題。

而且徹底修改現在的GIL機制牽扯到從底層重新設定cPython的核心,包括資源同步、gc策略等等,如果真的這樣修改,會大大降低python處理簡單單執行緒任務的效能,因為即使是單執行緒也需要做資源同步的話,開銷是相當大的。所以cPython在可預見的未來都不會改掉現在的GIL。

11樓:interma

1,暫沒有計畫,主要是對現有GC的有影響很大,有實現難度。

2,同Rio的答案,不過其他語言不了解了。

3,GIL的影響沒想象的那麼大,比如對於io密集型(網路/磁碟)程式。

pypy之前提供了乙個去掉GIL的思路(基於STM):

但是在pypy2.0版本中還是沒有做到去掉GIL。

除了多程序之外,採用協程(stackless python)也是乙個不錯的解決思路,不過我也沒有做過效能測試。

12樓:徐喬

Python當然可以利用多核。

關於Python最大的誤區大概就是「Python的多執行緒不能利用多核」會傳來傳去以後變成「Python不能利用多核」。

以現在Python主流應用之一伺服器開發舉例,根據CPU核心開對應數量的程序是非常普遍的做法。

至於非要用「多執行緒」的場合(比如非同步),也有不少「協程」方案可以使用,比如stackless python,又比如greenlet,以及由此發展出的可愛的gevent。

13樓:Rio

在可以遇見的相當長一段時間內,Python 的官方實現 CPython 不會解決 GIL 的問題。

Ruby 的官方實現 MRI 也有這個問題。

解決方案有很多,最常見的當然是用多程序。如果條件允許,也可以選擇沒有 GIL 限制的實現,比如基於 JVM 的 Jython 和 JRuby。

Python 關於讀寫txt的問題?

上面幾個回答說的很清楚了,不需要從頭開始讀取檔案,只需要把第一次讀取的內容儲存到乙個變數中,進行判斷就可以了。如果非要說實現從頭開始讀取的檔案的話,就先a.close 再open檔案一次唄。個人感覺比較蠢的辦法 火鍋大魔王 我想你需要的不是重新讀取 tmpFile a.readlines if tm...

想利用空閒時間學習下Python請問懂的大拿們,每天花半個小時到乙個小時能學的好麼?

亦彩 每天花半小時,學什麼東西,基礎語言麼?程式的目的是解決問題,最好帶著專案帶著目的去實踐,實踐中要解決什麼問題,然後自己再去找解決方法,時間長了,慢慢就熟悉了。語言裡面有很多類庫,函式,想去學完了不太現實,而且學完了到用的時候也不一定信手拈來,還是要解決各種問題。所以,還是建議做專案,帶著問題去...

關於python批量讀取網頁原始碼的問題?

usr bin python coding utf 8 import cookielib import sys import urllib import urllib2 def post url,password ck cookielib.CookieJar opener urllib2.build...