首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >发电机比“真正的”协同线差吗?

发电机比“真正的”协同线差吗?
EN

Stack Overflow用户
提问于 2014-02-05 17:55:09
回答 1查看 373关注 0票数 3

我想知道,当生成器扩展或以跨多个堆栈帧和协作的方式使用时,它在功能上是否仍然存在差异,因为它们是由一些语言提供的。

一方面,我看到一些语言,比如Python获得特性(最后一个是版本3.3中的yield from ),这些语言使得coroutines的大多数行为的实现变得简单明了,而没有提供实际的协同。另一方面,我看到像Kilim和Javaflow这样的项目,它们向Java添加了实际的协同,但是有一些限制,比如当coroutine生成检查异常时,必须对堆栈上的每个方法进行注释。

虽然这些项目都不允许Java程序使用不同的堆栈来实现协同,这就是Lua这样的语言来实现协同,但它们仍然提供了所有的特性,我知道,这些特性可以从coroutine实现中获得。但这使得它们(在实现中)非常类似于用yield from在Python中所能做的事情,我所能看到的唯一不同之处是,在Python中,可能产生的函数的每个调用站点都必须用from yield调用,而在Java中,可能产生的函数必须使用检查过的异常进行注释,而不更改调用方法的语句。

那么,实际上,像Lua这样的协同机制在功能上还存在差异吗?使用Python中的生成器和yield from可以做些什么呢?或者我们应该说Python (以及类似的生成器实现的语言)现在提供了协同服务吗?

EN

回答 1

Stack Overflow用户

发布于 2014-02-05 20:34:44

我使用Python生成器作为协同器。我在任何其他环境中都没有使用,而不是。根据你对他们的经验,这可能回答你的问题,也可能不回答。但是,下面是我使用的一些初学者代码,它们使用生成器以协同工作的方式发送和接收数据,甚至不用Python3的yield from语法:

首先,例程:

代码语言:javascript
运行
复制
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函数,它管理协同,发送当前时间并侦听数据

代码语言:javascript
运行
复制
def wait(processes):
    start = time.time()
    for process in processes:
        process.next()
        process.send(start)
    while True:
        now = time.time()
        for process in processes:
            value = process.send(now)
            if value:
                return value

最后,实现以下几点:

代码语言:javascript
运行
复制
def main():
    processes = []
    process.append(timer(5)
    processes.append(buttonwait())
    wait(processes)

我用它在带有2x16液晶屏幕的Raspberry Pi上:

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

这是一个有点复杂的开始,知道在哪里放置收益率和诸如此类的,但似乎合理的功能,一旦它是。没有线程,也没有多进程,所以您无法获得效率。但是您确实获得了独立的函数,这些函数都可以访问与其他函数相同的数据,都是以循环方式运行的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21584761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档