Python的網(wǎng)絡(luò)編程庫Gevent的安裝及使用技巧
安裝(以CentOS為例)
gevent依賴libevent和greenlet:
1.安裝libevent
直接yum install libevent
然后配置python的安裝
2.安裝easy_install
(1)
wget -q http://peak.telecommunity.com/dist/ez_setup.py
(2)使用
python ez_setup.py
(3)使用easy_install 查看命令是否可用,如果不可用可以講路徑加入到PATH中
3.安裝greenlet
(1)
yum install python-devel
(2)
easy_install greenlet
4.安裝gevent
pip install cython -e git://github.com/surfly/gevent.git@1.0rc2#egg=gevent
使用技巧
Gevent庫性能很高,但一直以來我都糾結(jié)在python的GIL模型導(dǎo)致的線程不能搶占多核資源上面。
而啟動多個python進程的這種利用多核的模式又需要增加前端負載均衡,比如lvs那些,有些麻煩。
multiprocessing模塊和os.fork又會使得兩個進程重復(fù)在事件核心注冊accept事件,導(dǎo)致文件句柄重復(fù)的異常。
至于一個進程監(jiān)聽,多個進程處理的模式,監(jiān)聽的那個進程資源又不好分配——是獨立分配一個核心還是不單獨分配呢?如果單獨分配,連接量小的時候就浪費了一個核心,如果不分配,連接量大的時候cpu又會頻繁切換進程。
昨日才發(fā)現(xiàn)原來gevent是可以很輕松地將它的網(wǎng)絡(luò)模型分布到多個進程并行處理的。
秘訣就在gevent.fork()。
以前想當然地認為gevent.fork只是greenlet.spawn的一個包裝,原來不是這樣。gevent.fork能替代os.fork,不僅會啟動一個新的進程,而且能將它們底層的事件處理溝通起來,進行并行處理。
import gevent from gevent.server import StreamServer def eat_cpu(): for i in xrange(10000): pass def cb(socket, address): eat_cpu() socket.recv(1024) socket.sendall('HTTP/1.1 200 OK\n\nHello World!!') socket.close() server = StreamServer(('',80), cb, backlog=100000) server.pre_start() gevent.fork() server.start_accepting() server._stopped_event.wait()
打上monkey.patch_os后,os.fork就可以被gevent.fork替代了,這樣同時multiprocessing模塊也可以像往常一樣使用,并達到并行處理的效果了。
from gevent import monkey; monkey.patch_os() from gevent.server import StreamServer from multiprocessing import Process def eat_cpu(): for i in xrange(10000): pass def cb(socket, address): eat_cpu() socket.recv(1024) socket.sendall('HTTP/1.1 200 OK\n\nHello World!!') socket.close() server = StreamServer(('',80), cb, backlog=100000) server.pre_start() def serve_forever(): server.start_accepting() server._stopped_event.wait() process_count = 4 for i in range(process_count - 1): Process(target=serve_forever, args=tuple()).start() serve_forever()
相關(guān)文章
學(xué)習Python,你還不知道m(xù)ain函數(shù)嗎
Python?中的?main?函數(shù)充當程序的執(zhí)行點,在?Python?編程中定義?main?函數(shù)是啟動程序執(zhí)行的必要條件。本文就來帶大家深入了解一下main函數(shù),感興趣的可以了解一下2022-09-09Python注釋、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、偽“選擇結(jié)構(gòu)”用法實例分析
這篇文章主要介紹了Python注釋、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、偽“選擇結(jié)構(gòu)”用法,結(jié)合實例形式分析了Python注釋、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、偽“選擇結(jié)構(gòu)”相關(guān)功能、用法及操作注意事項,需要的朋友可以參考下2020-01-01python批量處理多DNS多域名的nslookup解析實現(xiàn)
這篇文章主要介紹了python批量處理多DNS多域名的nslookup解析實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2020-06-06Python2和Python3.6環(huán)境解決共存問題
這篇文章主要介紹了Python2和Python3.6環(huán)境解決共存問題,需要的朋友可以參考下2018-11-11