用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 最難的問題
看了上面的評論,我很難理解為何我的python程式可以吧12個核都跑滿,不管用python2.6 還是2.7 還是pypy。真不知道python程式只能跑在一個核上的謠言是被這些半吊子傳成這樣很兇殘的狀況。一個半吊子python程式員寫的程式非常可能在效能上高於一個半吊子c程式員的程式。gil是針對一個python解譯器進程而言的,這才是真相,如果解譯器可以多進程解釋執行,那就不存在gil的問題了,同樣,他也不會導致你多個解譯器跑在同一個核上。scapy 用的libcap的庫效率很慢 可以試試scapy 的sendpfast 要快很對
搜尋關鍵詞是 Global Interpreter Lock
雖然我好多年沒用Py寫項目了,但是我想問:
> 開了200個線程,每個線程發送一個包後結束。
這樣真的好麼。。。線程真的是不要錢隨便開的麼。。。發現多線程程式在速度達到一定值以後,增加線程數並沒有獲得速度上的增長,後來索性用multiprocess了盡量使用不變數作為共用資料可以緩解,另外用pypy快很多,pypy搭載了JIT。試試Jython?