python GEV,python編程(gevent入門)

 2023-10-08 阅读 34 评论 0

摘要:【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】 ????大家都知道python腳本執行的時候不是很快,特別是python下面的多線程機制,長久以來一直被大家所詬病。所以,很多同學都在思考python

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】

????大家都知道python腳本執行的時候不是很快,特別是python下面的多線程機制,長久以來一直被大家所詬病。所以,很多同學都在思考python下面有沒有什么方法可以讓python執行地更快一些。其中這些方法包括:1、將復雜的代碼轉由c完成;2、多進程并發執行;3、用多線程完成io操作等等。另外,這幾年,大家討論最多的大概還是gevent協程機制。

1、協程的基本原理

????gevent的基本原理來自于libevent&libev。熟悉c語言的同學對這么一個lib應該不陌生。本質上libevent或者說libev都是一種事件驅動模型。這種模型對于提高cpu的運行效率,增強用戶的并發訪問非常有效。但是因為它本身是一種事件機制,所以寫起來有點繞,不是很直觀。所以,為了修正這個問題,有心人引入了用戶側上下文切換的機制。這就是說,如果代碼中引入了帶io阻塞的代碼時,lib本身會自動完成上下文的切換,全程用戶都是沒有覺察的。這就是gevent的由來。

2、gevent安裝

????ubuntu下面可以直接用apt-get安裝gevent庫。

sudo apt-get install python-gevent

3、gevent入門

????為了說明gevent的使用方法,我們可以看一段簡單的代碼,

import geventdef 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])

python GEV、????通過打印輸出,可以看出f1和f2是交叉打印信息的,因為在代碼執行的過程中,由用戶自己主動調用了切換函數。

4、延時操作

????關于延時,我們只需要將上面的代碼修改一下,即將sleep時間變長即可,

import geventdef 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])

5、鎖操作

????雖然是協程,但是在里面添加鎖增加對共享資源的互斥訪問也是非常重要的,此外鎖本身的添加也是很簡單的,

import gevent
from gevent.lock import Semaphoresem = 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])

6、延時和鎖

????大家可以看一下如果鎖和延時一起使用,會怎么樣?

import gevent
from gevent.lock import Semaphoresem = 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])

7、gevent下的monkey機制

????要是gevent說到這里,只能算的上還行。我個人覺得gevent另外一個特別厲害的功能就是它的monkey機制。簡單來說,假設你不愿意修改原來已經寫好的python代碼,但是又想充分利用gevent機制,那么你就可以用monkey來做到這一點。你所要做的就是在文件開頭打一個patch,那么它就會自動替換你原來的thread、socket、time、multiprocessing等代碼,全部變成gevent框架。這一切都是由gevent自動完成的。注意這個patch是在所有module都import了之后再打,否則沒有效果。

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

8、其他資料

????關于gevent,建議大家多看看英文第一手資料。比如官網、還有這里。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/128661.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息