带有自己的(无限)调用堆栈的gevent

时间:2015-03-08 06:46:59

标签: python gevent automata greenlets

我想知道如何定义一个有限状态机,它在python中使用greenlet而不会导致stckoverflow。

来自https://greenlet.readthedocs.org/en/latest/

"“greenlet”是一个小的独立伪线程。把它想象成一小堆帧;最外层(底部)框架是您调用的初始函数,最里面的框架是greenlet当前暂停的框架。您可以通过创建许多此类堆栈并在它们之间跳转执行来处理greenlet。跳跃从不隐含:greenlet必须选择跳转到另一个greenlet,这将导致前者暂停,后者恢复到暂停的位置。在greenlets之间跳跃称为“切换”。"

我知道我需要更改状态,并且我可以拥有如图所示的FSM: from a post I was reading

在这种情况下,如何确保不会出现堆栈溢出? 由于greenlet只给我一小堆框架,我对使用它持怀疑态度。

是否存在需要遵循的fsm设计范例,这有助于回到早期的堆栈帧?

TIA

1 个答案:

答案 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

=========================================