我想知道如何使用python中的greenlet定义一个具有循环的有限状态机,而不会导致stckoverflow。
来自https://greenlet.readthedocs.org/en/latest/
“greenlet”是一个小的独立伪线程。可以把它看作是一小堆帧;最外面(底部)的帧是你调用的初始函数,最里面的帧是当前暂停了greenlet的那个帧。你可以通过创建许多这样的堆栈并在它们之间跳转来处理greenlet。跳转从来不是隐式的:一个greenlet必须选择跳到另一个greenlet,这会导致前者暂停,而后者从暂停的地方恢复。在greenlet之间跳转称为“切换”。
我知道我需要更改状态,并且我可以拥有如下图所示的FSM:
如何确保在这种情况下不会命中堆栈溢出?因为greenlet只给了我“一小堆框架”,所以我对使用它持怀疑态度。
这里有没有需要遵循的fsm设计范例,它可以帮助我们回到早期的堆栈框架?
提亚
发布于 2015-03-08 18:02:43
我在这个问题上读了更多,似乎我应该使用Exception和try..except,这将不会导致另一个函数调用,从而避免堆栈溢出。来自:https://docs.python.org/2/faq/design.html
================================
为什么没有goto?
你可以使用异常来提供一个“结构化的goto”,甚至可以跨函数调用工作。许多人认为,异常可以方便地模拟C、Fortran和其他语言的“go”或“goto”结构的所有合理用法。
例如:
class label: pass #声明一个标签
try:
...
if condition: raise label() # goto label
...
except label: # where to goto
pass
=========================================
https://stackoverflow.com/questions/28923867
复制相似问题