def sleep(timer, action=None):
''' wait for time to elapse past a certain timer '''
yield # first yield cannot accept a message
now = then = yield
while now - then < timer:
now = yield
if action:
action()
else:
yield "timer finished"
def buttonwait():
''' yields button presses '''
yield
yield
while True:
c = screen.getch()
if c:
yield c
yield
从你的问题来看,我认为你混淆了两件事:协同例程和异步I/O运行循环。他们互不依赖。在
因为在Python中可以将值发送到生成器中,所以可以创建实现co-routine模式的代码。只需要
generator.send()
。链接到davidbeazley的代码是一个很好的例子,说明了如何创建一个co例程。这只是一种模式。pythonv3.3的新版本yield from
允许更灵活地使用此模式。David有一篇关于在一个同步计算世界中使用co例程可以做的所有事情的精彩演讲。在Python的asyncio模块依赖于
yield from
构造。他们已经创建了一个异步协同例程来打包此功能并将其与一个运行循环相关联。我相信,目标是让人们轻松地构建面向运行循环的应用程序。世界的曲折和龙卷风仍有其作用。在(我本人对Trollius这样的项目很警惕。他们是一个“跳舞的熊”项目。他们没有抓住重点。Asyncio是关于将一个简单的运行循环实现作为标准服务引入python3。python2已经有两个或更多优秀的异步I/O库。尽管这些图书馆很复杂。如果您是从Python3开始的,并且您的需求很简单,那么就使用asyncio,否则就使用Tornado。[Twisted还没有被移植]如果您是从python2开始的,那么Twisted或Tornado可能是您应该开始的地方。特洛利乌斯?Python版本3不兼容?一只优秀的“跳舞熊”。)
在我的书中,
asyncio
是将代码移到python3的一个很好的理由。我们生活在一个异步的世界中,运行循环是一个非常重要的特性,不适合特定于项目。在阿农, 安德鲁
我使用Python生成器作为协程,只使用内置方法。我在任何其他环境中都没有使用过协程,所以我的方法可能会被误导。在
下面是我编写的一些入门代码,它使用生成器以协同程序的方式发送和接收数据,甚至不使用python3的
yield from
语法:接下来,wait函数管理协程,发送当前时间并监听数据
^{pr2}$最后,实现以下目标:
我在一个带2x16液晶屏的覆盆子派上用这个来:
开始有点复杂,知道把
yield
放在什么地方等等,但一旦有了它似乎就可以正常工作了。在相关问题 更多 >
编程相关推荐