我想知道如何定义一个有限状态机,它在python中使用greenlet而不会导致stckoverflow。
来自https://greenlet.readthedocs.org/en/latest/:
"“greenlet”是一个小的独立伪线程。把它想象成一小堆帧;最外层(底部)框架是您调用的初始函数,最里面的框架是greenlet当前暂停的框架。您可以通过创建许多此类堆栈并在它们之间跳转执行来处理greenlet。跳跃从不隐含:greenlet必须选择跳转到另一个greenlet,这将导致前者暂停,后者恢复到暂停的位置。在greenlets之间跳跃称为“切换”。"
我知道我需要更改状态,并且我可以拥有如图所示的FSM:
在这种情况下,如何确保不会出现堆栈溢出? 由于greenlet只给我一小堆框架,我对使用它持怀疑态度。
是否存在需要遵循的fsm设计范例,这有助于回到早期的堆栈帧?
TIA
答案 0 :(得分:0)
我在这个问题上阅读了一些,似乎我应该使用Exception和try..except,这不会导致另一个函数调用,因此避免了stackoverflow。 来自:https://docs.python.org/2/faq/design.html
================================
为什么没有转到?
您可以使用异常来提供甚至可以跨函数调用工作的“结构化goto”。许多人认为异常可以方便地模仿C,Fortran和其他语言的“go”或“goto”结构的所有合理用法。
例如:
class label:pass#declare a label
try:
...
if condition: raise label() # goto label
...
except label: # where to goto
pass
=========================================