本文实例讲述了Python协程操作之gevent(收益率阻塞,一种绿色小鸟),协程实现多任务(有规律的交替协作执行)用法。分享给大家供大家参考,具体如下:
实现多任务:进程消耗的资源最大,线程消耗的资源次之,协程消耗的资源最少(单线程)。
gevent实现协程,gevent是通过阻塞代码(例如网络延迟等)来自动切换要执行的任务,所以在进行IO密集型程序时(例如爬虫),使用gevent可以提高效率(有效利用网络延迟的时间去执行其他任务)。
吉尔(全局解释器锁)是C语言版本的Python解释器中专有的,吉尔的存在让多线程的效率变低(哪个线程抢到锁,就执行哪个线程)。在IO密集型程序中,多线程依然比单线程效率高(吉尔通过IO阻塞自动切换多线程)。
解决吉尔(全局解释器锁)的问题的三种方法:1,不要用C语言版本的Python解释器。2,让子线程运行其他语言代码(例如:主线程运行Python代码,子线程运行C语言代码(C语言的动态库))。3,多进程代替多线程(多进程可以利用多核CPU)。
<强> demo.py(协程底层原理,收益率):强>
导入的时间 #带产生的函数并不是函数,而是一个生成器模板,返回一个生成器(可用于遍历迭代) def task_1 (): 而真正的: time . sleep (0.1) 收益率#阻塞等,待下一个迭代解阻塞 def task_2 (): 而真正的: time . sleep (0.1) 收益率 def main (): t1=task_1() #返回的t1是一个生成器。此时并未执行task_1中的代码 t2=task_2 () #先让t1运行一会,当t1中遇到收益的时候,再返回到24行,然后 #执行t2,当它遇到收益的时候,再次切换到t1中 #这样t1/t2/t1/t2的交替运行,最终实现了多任务....协程 而真正的: next (t1) #执行task_1中的代码,遇到收益率阻塞task_1。等待下一次下激活。 下一个(t2) #实现task_1与task_2交替执行,实现多任务,协程 if __name__==癬_main__”: main () >之前<强> demo.py(一种绿色小鸟实现协程,封装了收益率):强>
从一种绿色小鸟导入一种绿色小鸟#需要安装一种绿色小鸟模块sudo pip3安装一种绿色小鸟(python2.x使用pip) 导入的时间 def test1 (): 而真正的: 打印(”——————”) gr2.switch() #切换到gr2中的任务。 time . sleep (0.5) def test2 (): 而真正的: 打印(”——- b——”) gr1.switch() #切换到gr1一起中的任务。 time . sleep (0.5) gr1一起=一种绿色小鸟(test1) #一种绿色小鸟底层封装了收益率。 gr2=一种绿色小鸟(test2) #切换到gr1一起中运行 gr1.switch () >之前<强> demo.py (gevent实现协程,封装了一种绿色小鸟,遇到阻塞代码自动切换协程任务):强>
进口gevent #需要安装gevent模块sudo pip3安装gevent (python2.x使用pip) 导入的时间 def f1 (n): 因为我在范围(n): 打印(gevent.getcurrent(),我) gevent.sleep(0.5) #为了提高协程效率,遇到阻塞类代码,会自动切换协程任务。 # time . sleep(0.5) #阻塞类代码必须使用gevent自己包装的代码,原生阻塞类代码不会切换协程任务。 #可以使用monkey.patch_all()将所有原生阻塞类代码替换成gevent包装的阻塞类代码。 def f2 (n): 因为我在范围(n): 打印(gevent.getcurrent(),我)# & lt;一种绿色小鸟“Greenlet-0”0 x7f4a09b34648: f1(5)比;0 gevent.sleep (0.5) # time . sleep (0.5) def f3 (n): 因为我在范围(n): 打印(gevent.getcurrent(),我) gevent.sleep (0.5) # time . sleep (0.5) g1=gevent。产卵(f1, 5) # gevent其实是对一种绿色小鸟的封装。 g2=gevent。产卵(f2, 5)第号一个参数f2表示协程执行的具体任务(函数),第二个参数5表示要传给f2的参数 g3=gevent。产卵(f3, 5) g1.join() #遇到阻塞类代码,自动切换协程任务。 g2.join () g3.join () >之前运行结果:
& lt;一种绿色小鸟在0 x1985030: f1(5)比;0
& lt;一种绿色小鸟在0 x1b431c8: f2(5)比;0
& lt;一种绿色小鸟在0 x1b43140: f3(5)比;0
& lt;一种绿色小鸟在0 x1985030: f1(5)比;1
& lt;一种绿色小鸟在0 x1b431c8: f2(5)比;1
& lt;一种绿色小鸟在0 x1b43140: f3(5)比;1
& lt;一种绿色小鸟在0 x1985030: f1(5)比;2Python协程操作之gevent(收益率阻塞,一种绿色小鸟),协程实现多任务(有规律的交替协作执行)用法详解