初看這個標題,相信很多同學都笑了,python有效能可言麼,呵呵噠…確實哦,python其實就是為了快速開發應用而出生的,雖然python的服務都以效能低而聞名全世界,但是總該有最佳化的地方吧,呵呵噠….
這不,這兩天本作者就碰見了這樣一個問題,首先自我介紹下,我是幹嘛的,肯定是屌絲程式員了,這個猜都不用猜,要不然也不會蛋疼的寫這篇文章了,我們組是基礎開發組,就是專門開發一些剝離業務的元件讓其他部門去用,比如業務監控,業務報警,服務資料採集等等一堆搬磚的活.好了,廢話不多說了,估計看到這的也都看煩了…你們真的煩了麼
這樣滴,我們這有個收集業務資料的元件簡稱M好啦,首先他要在業務伺服器上建個udpserver,然後就靜靜的等業務的客戶端上報資料過來,資料格式是key-value形式的,然而就在最近幾天,有人在給業務機器做壓測的時候,發現一個問題,隨著併發的增加,這個M元件的cpu使用率也在不斷上升,擦,這下伺服器不願意了,開始瘋狂報警,然後做壓測的那個人就找我這來了,巴拉巴拉一堆,意思就是我給業務做壓測,你收集資料的元件飈個毛啊……
然而我是那麼容易被打倒的麼,就解釋說當然啊,你在給業務壓測的時候,同時你的client也在請求我啊,相當於我的併發量也在上升啊,不飈才怪呢,好吧,說歸說,抱著工匠精神,開始找問題吧…
這個M元件是用python寫的多執行緒的udpserver,經本人測試,當併發達到2000的時候,cpu就100%左右了,其實udp相比tcp而言效能已經很高了,不過這個併發還是有點感人啊,改成多行程也試了下,cpu佔用還是70%左右,畢竟多行程適用計算密集型的,於是就想到了協程,協程像是一種在程式級別來模擬系統級別 的行程,由於是單行程,並且少了背景關係切換,於是相對來說系統消耗很少,而網上的各種測試也表明,協程確實擁有驚人的速度。並且在實現過程中,協程可以 用以前同步思路的寫法,而執行起來確是非同步的,挺有意思。
聽說python有個模組叫做eventlet很強大,eventlet的核心是協程(也叫做green thread)。協程的好處是沒有執行緒開銷來的大(比如切換代價很小)。同時協程由於排程都由開發者自己決定,所以對lock的需求就很低了
上面是一個uds(unix domian socket)的例子,這裡也是透過一個pool限制資源的使用。當每個請求來的時候透過spawn_n方法把對這個請求的handle方法放到獨立的協程中去處理。而handle中的recv這些方法都是被綠化過的,所以如果讀取不到資料這些方法就會把cpu時間交出來給別的協程使用,eventlet還有一個衍生品gevent,先看看例子:
上面是官方的例子,gevent是一個基於libev的python併發框架,以微執行緒greenlet為核心,使用了epoll事件監聽機制以及諸多其他最佳化而變得高效.而且其中有個monkey類, 將現有基於Python執行緒直接轉化為greenlet(類似於打patch)。
我自己測試了下,無論是eventlet寫的uds還是gevent寫的udpserver 併發達到2000時,cpu大概佔用到30%左右,效能比之前降了2/3,效果還是很顯著的,不過這個還是沒有達到理想效果,後期準備嘗試下日誌的方式,應該會比現在更省資源,就怕磁碟受不了,更何況我們用的還是所謂的雲主機~
參考連結:
https://github.com/gevent/gevent
http://xlambda.com/gevent-tutorial/
https://github.com/eventlet/eventlet/tree/master/examples
作者:浩海星辰
連結:http://www.jianshu.com/p/c0e3271ac887
————廣告時間————
馬哥教育2018年Python自動化運維開發實戰面授班2018年3月5號開班,馬哥聯合BAT、豆瓣等一線網際網路Python開發達人,根據目前企業需求的Python開發人才進行了深度定製,加入了大量一線網際網路公司:大眾點評、餓了麼、騰訊等生產環境真是專案,課程由淺入深,從Python基礎到Python高階,讓你融匯貫通Python基礎理論,手把手教學讓你具備Python自動化開發需要的前端介面開發、Web框架、大監控系統、CMDB系統、認證堡壘機、自動化流程平臺六大實戰能力,讓你從0開始蛻變成Hold住年薪20萬的Python自動化開發人才。
掃描二維碼領取學習資料
更多Python好文請點選【閱讀原文】哦
↓↓↓