Python3.4之前的协同程序

2024-06-12 21:42:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我想确认以下问题:

  1. Python2中没有本机协程装饰器。它将由 [1]之类的东西提供。

  2. 在Python3.4之前,所有其他Python3版本都需要pip install asyncio才能使用import asyncio.coroutine[2]

  3. trollius是python2的aysncio和tulips的参考端口实现(社区认为应该使用它)?

谢谢。在


Tags: installpip端口import版本asyncio装饰python3
2条回答

从你的问题来看,我认为你混淆了两件事:协同例程和异步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语法:

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

接下来,wait函数管理协程,发送当前时间并监听数据

^{pr2}$

最后,实现以下目标:

def main():
    processes = []
    process.append(timer(5)
    processes.append(buttonwait())
    wait(processes)

我在一个带2x16液晶屏的覆盆子派上用这个来:

  • 响应按钮按下
  • 超时后关闭背光
  • 滚动长文本
  • 移动电机
  • 发送串行命令

开始有点复杂,知道把yield放在什么地方等等,但一旦有了它似乎就可以正常工作了。在

相关问题 更多 >