我想知道,当生成器扩展或以跨多个堆栈帧和协作的方式使用时,它在功能上是否仍然存在差异,因为它们是由一些语言提供的。
一方面,我看到一些语言,比如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 (以及类似的生成器实现的语言)现在提供了协同服务吗?
发布于 2014-02-05 20:34:44
我使用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
函数,它管理协同,发送当前时间并侦听数据
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
最后,实现以下几点:
def main():
processes = []
process.append(timer(5)
processes.append(buttonwait())
wait(processes)
我用它在带有2x16液晶屏幕的Raspberry Pi上:
这是一个有点复杂的开始,知道在哪里放置收益率和诸如此类的,但似乎合理的功能,一旦它是。没有线程,也没有多进程,所以您无法获得效率。但是您确实获得了独立的函数,这些函数都可以访问与其他函数相同的数据,都是以循环方式运行的。
https://stackoverflow.com/questions/21584761
复制相似问题