Python协程操作之gevent(收益率阻塞,一种绿色小鸟),协程实现多任务(有规律的交替协作执行)用法详解

  

本文实例讲述了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)比;2

Python协程操作之gevent(收益率阻塞,一种绿色小鸟),协程实现多任务(有规律的交替协作执行)用法详解