资讯专栏INFORMATION COLUMN

【generator101】- generator是可以被外部控制执行进度的函数

yacheng / 1242人阅读

摘要:协程是用来处理阻塞和流程阻塞这两个普世问题的得力工具,可以达到比较好的。这段代码执行的输出是通过这个例子,可以了解到的的两个特性。被调用一次,函数就往前执行一步。通过控制,可以从外面控制函数内部的执行进度。

很多码农终其一生可能在代码上干的事情无非就是追求两件事情:Logic Locality 和 Data Locality。前者决定了开发效率,后者决定了运行效率。协程是用来处理I/O阻塞和流程阻塞这两个普世问题的得力工具,可以达到比较好的Logic Locality。

def demo_before_and_after():
    print("before")
    yield
    print("after")

gen = demo_before_and_after()
gen.next()
gen.next()

这段代码执行的输出是

gen created
before
after
Traceback (most recent call last):
...
StopIteration

通过这个例子,可以了解到Python的generator的两个特性。
首先,demo_before_and_after()的时候,before并没有被打印出来。说明demo_before_and_after这个函数在这个时候还没有真正开始执行。gen.next()被调用一次,函数就往前执行一步。通过控制gen.next(),可以从外面控制函数内部的执行进度。
其次,Python的generator没有类似Java的Iterator.hasNext这样的设计,直接以抛出StopIteration来传达“到尾巴了”这个消息。

利用generator这个特性,Python的标准库提供了一个非常方便的contextmanager的设计

import contextlib

@contextlib.contextmanager
def demo_before_and_after():
    print("before")
    yield
    print("after")

with demo_before_and_after():
    print("inside")

输出结果是

before
inside
after

很多需要获得资源,使用资源,然后确保资源被正确释放的场合(类似C++的RAII),都可以用上面的写法来实现。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37382.html

相关文章

  • generator101】 - generator输入与输出

    摘要:的是可以有输入输出的,这个特性并不广为人知。也就是要求不返回值,而是抛出给定的异常。执行之后的输出与前面是一样的。 Python的generator是可以有输入输出的,这个特性并不广为人知。这其实是一个挺有用的特性,利用其外部可控制执行进度的特性,再加上可以与外部进行输入输出,generator可以被用来打造成一个异步执行框架,或者说是协程调度引擎。 我们先来看一个最简单的例子,gen...

    melody_lql 评论0 收藏0
  • generator101】 - generator一种显式控制协程

    摘要:协程其实就是一个可中途中断,由外部来控制执行进程的函数。这些第三方的选择的共同特点是协程的都是隐式的。这就是显示控制和隐式控制的区别。本文讨论的协程就是这一种,后面会逐渐展开到如何利用这种显示控制的协程来解决阻塞和流程阻塞的问题。 Python官方的实现里,协程只有generator这一招。协程其实就是一个可中途中断,由外部来控制执行进程的函数。除了官方的generator,还有很多第...

    894974231 评论0 收藏0
  • generator101】 - 对比generator和greenlet

    摘要:比如里可以直接把执行权交给,而完全不知情。虽然不能和多线程相比,但是效果是类似的。对于多线程的代码,是任何一行代码都可能与其他线程并行。加上协程之间有共享状态的话,一定程度上会产生类似多线程的并发读写状态的。 前面讲generator是显式的协程的时候缺一个例子,现在补上 def parent_generator(): print(hello) yield from ...

    CoyPan 评论0 收藏0
  • generator101】 - yield from

    摘要:我们可以看一下的可见是由内部支持的,其实现原理上就避免了栈进栈出的消耗,直接由最内层的返回值。另外可以实现外部直接向最内层的传递值,比如这段代码的输出是这样传值的方式,在用循环重新的模式下是无法实现的。这也就是必须使用,而不能使用的原因。 在python 3.3里,generator新增了一个语法 yield from 这个yield from的作用是什么?看下面两段对比的代码: d...

    xiaodao 评论0 收藏0
  • 深入理解 Generator 函数

    摘要:同时,迭代器有一个方法来向函数中暂停处抛出一个错误,该错误依然可以通过函数内部的模块进行捕获处理。 本文翻译自:Diving Deeper With ES6 Generators 由于个人能力有限,翻译中难免有纰漏和错误,望不吝指正issue ES6 Generators:完整系列 The Basics Of ES6 Generators Diving Deeper With E...

    jzzlee 评论0 收藏0

发表评论

0条评论

yacheng

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<