Java 发电机是否劣于;“真正的”;共程?

Java 发电机是否劣于;“真正的”;共程?,java,python,lua,coroutine,Java,Python,Lua,Coroutine,我想知道,当生成器被扩展或用于跨越多个堆栈帧和协同路由时,它通常被称为生成器,这两者之间是否还有功能上的区别,因为它们是由一些语言本机提供的 一方面,我看到像Python这样的语言获得了一些特性(最后一个是从3.3版的中获得的),这些特性使大多数协同路由行为的实现变得简单,而不提供实际的协同路由。另一方面,我看到像Kilim和Javaflow这样的项目将实际的协同路由添加到Java中,但有一些限制,比如当协同路由产生一个选中的异常时,必须对堆栈上的每个方法进行注释 虽然这些项目都不允许Java程

我想知道,当生成器被扩展或用于跨越多个堆栈帧和协同路由时,它通常被称为生成器,这两者之间是否还有功能上的区别,因为它们是由一些语言本机提供的

一方面,我看到像Python这样的语言获得了一些特性(最后一个是从3.3版的中获得的),这些特性使大多数协同路由行为的实现变得简单,而不提供实际的协同路由。另一方面,我看到像Kilim和Javaflow这样的项目将实际的协同路由添加到Java中,但有一些限制,比如当协同路由产生一个选中的异常时,必须对堆栈上的每个方法进行注释

虽然这些项目都不允许Java程序使用不同的堆栈来实现协同路由(这是Lua等语言实现协同路由的方式),但据我所知,它们仍然提供了协同路由实现所需的所有功能。但这使得它们(在实现中)与Python中使用
yield from
所能做的非常相似,我能看到的唯一区别是,在Python中,可能产生的函数的每个调用位置都必须使用
from yield
调用,而在Java中,可能产生的函数必须在不更改调用方法的语句的情况下使用选中的异常进行注释


那么,在诸如Lua中提供的协同程序之间,在功能上是否仍然存在差异,以及使用生成器和Python中的产生的可以做什么,或者我们应该说Python(以及具有类似生成器实现的语言)现在提供了协同程序?

我已经使用Python生成器作为协同程序。我没有在任何其他环境中使用协程。根据您与他们的经验水平,这可能回答您的问题,也可能不回答您的问题。但这里有一些我使用过的入门代码,它使用生成器以协同路由的方式发送和接收数据,甚至不使用Python 3的
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
最后,实施这些措施:

def main():
    processes = []
    process.append(timer(5)
    processes.append(buttonwait())
    wait(processes)
我在带有2x16 LCD屏幕的覆盆子Pi上使用了此功能:

  • 对按钮按下作出反应
  • 超时后关闭背光
  • 滚动长文本
  • 移动马达
  • 发送串行命令


开始有点复杂,知道把收益率放在哪里等等,但一旦开始,它似乎就可以正常工作了。没有线程,也没有多进程,因此无法获得这种效率。但是您确实获得了独立的函数,这些函数都可以访问与其他函数相同的数据,都以循环方式运行

谢谢您的示例,但您并没有真正解决我的问题,这就是Python的生成器和Lua的协同程序之间是否存在功能上的差异。如果您想要与Lua的协同程序进行特定的比较,那么应该在这个问题中添加Lua标记。我相信没有功能上的区别,但只有Lua开发人员的知识才能确定这一点。同时,我的回答可能会帮助他们理解Python,并给他们提供知识来进行比较。你是对的,标签
java
Python
只提到了一些不太全面的协同程序的语言
def main():
    processes = []
    process.append(timer(5)
    processes.append(buttonwait())
    wait(processes)