python gevent

  你們都知道python腳本執行的時候不是很快,特別是python下面的多線程機制,長久以來一直被你們所詬病。因此,不少同窗都在思考python下面有沒有什麼方法可讓python執行地更快一些。其中這些方法包括:一、將複雜的代碼轉由c完成;二、多進程併發執行;三、用多線程完成io操做等等。另外,這幾年,你們討論最多的大概仍是gevent協程機制。python

一、協程的基本原理
    gevent的基本原理來自於libevent&libev。熟悉c語言的同窗對這麼一個lib應該不陌生。本質上libevent或者說libev都是一種事件驅動模型。這種模型對於提升cpu的運行效率,加強用戶的併發訪問很是有效。可是由於它自己是一種事件機制,因此寫起來有點繞,不是很直觀。因此,爲了修正這個問題,有心人引入了用戶側上下文切換的機制。這就是說,若是代碼中引入了帶io阻塞的代碼時,lib自己會自動完成上下文的切換,全程用戶都是沒有覺察的。這就是gevent的由來。ubuntu

二、gevent安裝
    ubuntu下面能夠直接用apt-get安裝gevent庫。多線程

sudo apt-get install python-gevent

三、gevent入門
    爲了說明gevent的使用方法,咱們能夠看一段簡單的代碼,併發

import gevent

def f1():
for i in range(5):
print 'this is ' + str(i)
gevent.sleep(0)

def f2():
for i in range(5):
print 'that is ' + str(i)
gevent.sleep(0)

t1 = gevent.spawn(f1)
t2 = gevent.spawn(f2)
gevent.joinall([t1, t2])

    經過打印輸出,能夠看出f1和f2是交叉打印信息的,由於在代碼執行的過程當中,由用戶本身主動調用了切換函數。框架

四、延時操做
    關於延時,咱們只須要將上面的代碼修改一下,即將sleep時間變長便可,socket

import gevent

def f1():
for i in range(5):
print 'this is ' + str(i)
gevent.sleep(3)

def f2():
for i in range(5):
print 'that is ' + str(i)
gevent.sleep(3)

t1 = gevent.spawn(f1)
t2 = gevent.spawn(f2)
gevent.joinall([t1, t2])

五、鎖操做
    雖然是協程,可是在裏面添加鎖增長對共享資源的互斥訪問也是很是重要的,此外鎖自己的添加也是很簡單的,函數

import gevent
from gevent.lock import Semaphore

sem = Semaphore(1)

def f1():
for i in range(5):
sem.acquire()
print 'this is ' + str(i)
sem.release()

def f2():
for i in range(5):
sem.acquire()
print 'that is ' + str(i)
sem.release()

t1 = gevent.spawn(f1)
t2 = gevent.spawn(f2)
gevent.joinall([t1, t2])

六、延時和鎖
    你們能夠看一下若是鎖和延時一塊兒使用,會怎麼樣?ui

import gevent
from gevent.lock import Semaphore

sem = Semaphore(1)

def f1():
for i in range(5):
sem.acquire()
print 'this is ' + str(i)
sem.release()
gevent.sleep(2)

def f2():
for i in range(5):
sem.acquire()
print 'that is ' + str(i)
sem.release()

t1 = gevent.spawn(f1)
t2 = gevent.spawn(f2)
gevent.joinall([t1, t2])

七、gevent下的monkey機制
    要是gevent說到這裏,只能算的上還行。我我的以爲gevent另一個特別厲害的功能就是它的monkey機制。簡單來講,假設你不肯意修改原來已經寫好的python代碼,可是又想充分利用gevent機制,那麼你就能夠用monkey來作到這一點。你所要作的就是在文件開頭打一個patch,那麼它就會自動替換你原來的thread、socket、time、multiprocessing等代碼,所有變成gevent框架。這一切都是由gevent自動完成的。注意這個patch是在全部module都import了以後再打,不然沒有效果。this

from gevent import monkey; monkey.patch_all()
import gevent

 

---------------------
原文:https://blog.csdn.net/feixiaoxing/article/details/79056535

spa

相關文章
相關標籤/搜索