greenlet 详解

本文详细介绍了Python的greenlet库,探讨了greenlet与普通函数调用的区别,greenlet的生命周期,以及使用greenlet时的注意事项。通过示例代码展示了greenlet的创建、切换和异常处理,强调了确保greenlet正常结束以防止内存泄漏的重要性。
摘要由CSDN通过智能技术生成

目录

  • greenlet初体验
  • greenlet module与class
  • Switch not call
  • Greenlet生命周期
  • Greenlet Traceing
  • greenlet使用建议
  • 总结

 

正文

   在前面的文章中提到python原生的generator是semicoroutine,而greenlet是 真 协程。本文内容主要来自对官网文档的翻译,在其中也加入了很多自己的理解和例子。主要包括以下内容:什么是greenlet,greenlet的切换与函数调用的区别,greenlet的生命周期,以及使用greenlet的注意事项。

greenlet初体验

回到顶部

  Greenlet是python的一个C扩展,来源于Stackless python,旨在提供可自行调度的‘微线程’, 即协程。generator实现的协程在yield value时只能将value返回给调用者(caller)。 而在greenlet中,target.switch(value)可以切换到指定的协程(target), 然后yield value。greenlet用switch来表示协程的切换,从一个协程切换到另一个协程需要显式指定。

  greenlet的安装很简单:pip install greenlet 即可,安装好了之后我们来看一个官方的例子

复制代码
 1 from greenlet import greenlet
 2 def test1():
 3     print 12
 4     gr2.switch()
 5     print 34
 6 
 7 def test2():
 8     print 56
 9     gr1.switch()
10     print 78
11 
12 gr1 = greenlet(test1)
13 gr2 = greenlet(test2)
14 gr1.switch()
复制代码

  输出为:
    12 56 34

  当创建一个greenlet时,首先初始化一个空的栈, switch到这个栈的时候,会运行在greenlet构造时传入的函数(首先在test1中打印 12), 如果在这个函数(test1)中switch到其他协程(到了test2 打印34),那么该协程会被挂起,等到切换回来(在test2中切换回来 打印34)。当这个协程对应函数执行完毕,那么这个协程就变成dead状态。
  

  注意 上面没有打印test2的最后一行输出 78,因为在test2中切换到gr1之后挂起,但是没有地方再切换回来。这个可能造成泄漏,后面细说。

greenlet module与class

回到顶部

  我们首先看一下greenlet这个module里面的属性

  >>> dir(greenlet)
  ['GREENLET_USE_GC', 'GREENLET_USE_TRACING', 'GreenletExit', '_C_API', '__doc__', '__file__', '__name__', '__package__', '__version__', 'error', 'getcurrent', 'gettrace', 'greenlet', 'settrace']
  >>>

  其中,比较重要的是getcurrent(), 类greenlet、异常类GreenletExit。

  getcurrent()返回当前的greenlet实例

  GreenletExit:是一个特殊的异常,当触发了这个异常的时候,即使不处理,也不会抛到其parent(后面会提到协程中对返回值或者异常的处理)

  然后我们再来看看greenlet.greenlet这个类:

  >>> dir(greenlet.greenlet)

  ['GreenletExit', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getstate__', '__hash__', '__init__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',   '__sizeof__', '__str__', '__subclasshook__', '_stack_saved&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值