Python 多線程效率不高嗎?
01-06
用scapy發送icmp包。開了200個線程,每個線程發送一個包後結束。測試了下只有300包/sec的速度,是python的多線程效率不高的問題嗎?
---------------------------------------後來發現不是多線程的問題,是scapy本來發包就慢的問題。單線程scapy每秒幾個包,多線程最多每秒60.用C寫的話每秒3w..
Python由於有全鎖局的存在(同一時間只能有一個線程執行),並不能利用多核優勢。所以,如果你的多線程進程是CPU密集型的,那多線程並不能帶來效率上的提升,相反還可能會因為線程的頻繁切換,導致效率下降;如果是IO密集型,多線程進程可以利用IO阻塞等待時的空閑時間執行其他線程,提升效率。
開了200個線程,每個線程發送一個包後結束。=========換個姿勢黑Python好嗎?比如說for循環比C語言慢幾萬倍什麼的。
不同線程同時訪問資源時,需要使用保護機制,Python中使用GIL(解釋器全局鎖)。直觀上,這是一個加在解釋器上的全局(從解釋器的角度看)鎖。這意味著對於任何Python程序,不管有多少的處理器,任何時候都總是只有一個線程在執行。所以,如果沒有IO操作,python中的多線程比單線程效率還低。可以看這個 Python 最難的問題
搜索關鍵詞是 Global Interpreter Lock
看了上面的評論,我很難理解為何我的python程序可以吧12個核都跑滿,不管用python2.6 還是2.7 還是pypy。真不知道python程序只能跑在一個核上的謠言是被這些半吊子傳成這樣很兇殘的狀況。一個半吊子python程序員寫的程序非常可能在性能上高於一個半吊子c程序員的程序。gil是針對一個python解釋器進程而言的,這才是真相,如果解釋器可以多進程解釋執行,那就不存在gil的問題了,同樣,他也不會導致你多個解釋器跑在同一個核上。
盡量使用不變數作為共享數據可以緩解,另外用pypy快很多,pypy搭載了JIT。
雖然我好多年沒用Py寫項目了,但是我想問:
&> 開了200個線程,每個線程發送一個包後結束。
這樣真的好么。。。線程真的是不要錢隨便開的么。。。想起當年我和朋友爭論py和java
朋友寫了兩個demo,java的開了幾個線程就把cpu跑滿了,py無論開多少線程,cpu始終保持很低,於是朋友得出結論:你看py多牛逼,這麼大的並發始終保持cpu低負載。。。
那時候我還年輕。。。竟反駁不了。。 。scapy 用的libcap的庫效率很慢 可以試試scapy 的sendpfast 要快很對
發現多線程程序在速度達到一定值以後,增加線程數並沒有獲得速度上的增長,後來索性用multiprocess了
好歹寫個循環,每次設置遞增數量的線程數,測試速度畫個表再來問這個問題好么。
我想全局鎖只存在於c實現的python解釋器。如果是java 或者c # 實現的 可以跑多核。
試試Jython?
....啟動一個線程的時間也許大於你發一個包的時間...一個線程發完一個包就結束也算是任性啊
多線程 IO 再加個隊列 ,。爬蟲的標配吧
CPython implementation detail: In CPython, due to the Global Interpreter Lock, only one thread can execute Python code at once (even though certain performance-oriented libraries might overcome this limitation). If you want your application to make better use of the computational resources of multi-core machines, you are advised to use multiprocessing. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks simultaneously
推薦閱讀:
※Python 開發中有哪些高級技巧?
※excel中想實現使用Python代替VBA,請問應該怎麼做?
※如何優雅的安裝Python的pandas?
※怎樣使 Python 輸出時不換行?