- def consumer(func):
- def wrapper(*args,**kw):
- gen = func(*args, **kw)
- gen.next()
- return gen
- wrapper.__name__ = func.__name__
- wrapper.__dict__ = func.__dict__
- wrapper.__doc__ = func.__doc__
- return wrapper

本文重要介绍python中Enhanced generator即coroutine相干内容,包含根本语法、应用处景、留意事项,以及与其他说话协程实现的异同。
enhanced generator
回到Coroutine,可拜见维诽谤科解释,而我本身的懂得比较简单(或者单方面):法度榜样员可控制的并发流程,不管是过程照样线程,其切换都是操作体系在调剂,而对于协程,法度榜样员可以控制什么时刻切换出去,什么时刻切换回来。协程比过程 线程轻量级很多,较少了高低文切换的开销。别的,因为是法度榜样员控制调剂,必定程度上也能避寐一?义务被半途中断.。协程可以用在哪些场景呢,我认为可以归纳为非浊宣等待的场景,如游戏编程,异步IO,事宜驱动。
在上文《Python Yield Generator 详解》中介绍了yield和generator的应用处景和主意事项,只用到了generator的next办法,事实上generator还有更强大年夜的功能。PEP 342为generator增长了一系列办法来使得generator更像一个协程Coroutine。做重要的变更在于早期的yield只能返回值(作为数据的产生者), 而新增长的send办法能在generator恢复的时刻花费一个数值,而去caller(generator的调用着)也可以经由过程throw在generator挂起的主动抛出异常。
除了next和send办法,generator还供给了两个实用的办法,throw和close,这两个办法加强了caller对generator的┞菲握。send办法可以传递一个值给generator,throw办法在generator挂起的处所抛出异常,close办法让generator正常停止(之后就不克不及再调用next send了)。下面具体介绍一下throw办法。
- back_data = yield cur_ret
这段代码的意思是:当履行到这条语句时,返回cur_ret给调用者;并且当generator经由过程next()或者send(some_data)办法恢复的时刻,将some_data赋值给back_data.例如:
- def gen(data):
- print 'before yield', data
- back_data = yield data
- print 'after resume', back_data
- if __name__ == '__main__':
- g = gen(1)
- print g.next()
- try:
- g.send(0)
- except StopIteration:
- pass
输出:
- before yield 1
- 1
推荐阅读
本文的目标是以“输入 URL 后产生了什么”这个经典面试题为引子,写一篇既可以或许涵盖面试中大年夜部分收集试题,又可以或许将“输入 URL 后产生什么”讲得有深度的>>>详细阅读
本文标题:Python增强的生成器:协程
地址:http://www.17bianji.com/lsqh/37169.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示