【问题标题】:fsm with gevent with its own (infinite) call stackfsm 与 gevent 及其自己的(无限)调用堆栈
【发布时间】:2015-03-08 06:46:58
【问题描述】:

我想知道如何在 python 中使用 greenlet 定义具有循环的有限状态机而不会导致 stckoverflow。

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

“一个“greenlet”是一个小的独立伪线程。把它想象成一小堆框架;最外层(底部)框架是你调用的初始函数,最内层是greenlet所在的框架当前已暂停。您可以通过创建许多这样的堆栈并在它们之间跳转执行来使用greenlet。跳转绝不是隐式的:一个greenlet必须选择跳转到另一个greenlet,这将导致前者暂停而后者在它所在的位置恢复被暂停了。在greenlets之间跳转称为“切换”。”

我知道我需要更改状态,并且我可以拥有如图所示的 FSM:

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

这里是否有需要遵循的 fsm 设计范式可以帮助回到早期的堆栈帧?

TIA

【问题讨论】:

    标签: python gevent automata greenlets


    【解决方案1】:

    我阅读了更多关于这个问题的内容,看来我应该使用 Exception 和 try..except,这不会导致另一个函数调用,因此可以避免 stackoverflow。 来自: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
    

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

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 2019-05-09
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 2012-06-26
      相关资源
      最近更新 更多