欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python的網(wǎng)絡編程庫Gevent的安裝及使用技巧

 更新時間:2016年06月24日 16:44:14   作者:烏龜殼  
Gevent庫的奧義在于并發(fā)式的高性能網(wǎng)絡程序設計支持,這里我們將來講解Python的網(wǎng)絡編程庫Gevent的安裝及使用技巧,來看一下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模型導致的線程不能搶占多核資源上面。
而啟動多個python進程的這種利用多核的模式又需要增加前端負載均衡,比如lvs那些,有些麻煩。
multiprocessing模塊和os.fork又會使得兩個進程重復在事件核心注冊accept事件,導致文件句柄重復的異常。
至于一個進程監(jiān)聽,多個進程處理的模式,監(jiān)聽的那個進程資源又不好分配——是獨立分配一個核心還是不單獨分配呢?如果單獨分配,連接量小的時候就浪費了一個核心,如果不分配,連接量大的時候cpu又會頻繁切換進程。
昨日才發(fā)現(xiàn)原來gevent是可以很輕松地將它的網(wǎng)絡模型分布到多個進程并行處理的。
秘訣就在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()

相關文章

最新評論