python-3.x 核跃迁:如何在一个状态机中实现一个同时具有层次机和异步机特性的状态机?

6ioyuze2  于 2022-12-05  发布在  Python
关注(0)|答案(1)|浏览(157)

我想建立一个统计机器,这样它就可以同时拥有层次机器和异步机器的特性。我尝试了这段代码,但是层次机器和异步机器不能同时工作。
`

from transitions.extensions.markup import MarkupMachine
from transitions.extensions.factory import HierarchicalMachine
from transitions.extensions.asyncio import AsyncMachine
QUEUED = False

class Unhealthy(HierarchicalMachine, AsyncMachine):
    def __init__(self):
        states = [{"name":'aborted', "on_enter":[]},
                    {"name":'clearancetimeouterr', "on_enter":[]},
                    {"name":"awaitingclearanceerr", 'on_enter':[]},
                    {"name":"cleared", 'on_enter':[]}
                    ]
        transitions = [{"trigger":"abort", "source":"aborted", "dest":"awaitingclearanceerr"},
                        {"trigger":"awaitingclearanceerr", "source":"clearancetimeout", "dest":"awaitingclearanceerr"},
                        {"trigger":"cleared", "source":"awaitingclearanceerr", "dest":"cleared"}]
        super().__init__(states=states, transitions=transitions, initial="awaitingclearanceerr", queued=QUEUED)
        

class Healthy(HierarchicalMachine, AsyncMachine):
    def __init__(self):
        unhealthy = Unhealthy()
        states = [{"name":'idle', 'on_enter':[]},
                    {"name":"busy", 'on_enter':[]},
                    {"name":"done", 'on_enter':[]}]

        transitions = [{'trigger':'start', 'source':'idle', 'dest':'busy'},
                        {"trigger":"done", "source":"busy", "dest":"done"},
                        {"trigger":"idle", "source":"awaiting_clearance", "dest":"idle"}]
        super().__init__(states=states, transitions=transitions, initial="idle", queued=QUEUED)


class StateMachine(HierarchicalMachine, MarkupMachine, AsyncMachine):
    def __init__(self):
        unhealthy= Unhealthy()
        healthy = Healthy()
        states = [{'name':"idle"}, {"name":'healthy', 'children':healthy}, {"name":"unhealthy", "children":unhealthy}]
        super().__init__(states=states, initial="idle", queued=QUEUED)
        self.add_transition("start_machine", "idle", "healthy")
        self.add_transition('abort', 'healthy', 'unhealthy')

I want something like that but HierarchicalMachine and AsyncMachine are not working together. And giving the following error:运行时错误:AsyncMachine不应调用Machine._process请改用Machine._process_async '

nzk0hqpo

nzk0hqpo1#

transitions文档的扩展部分提到了以下内容:
有两种机制来检索启用了所需特性的状态机示例。第一种方法利用便利工厂,如果需要该特性,则将四个参数graph、nested、locked或asyncio设置为True

from transitions.extensions import MachineFactory

AsyncHSM = MachineFactory.get_predefined(nested=True, asyncio=True)

machine = AsyncHSM(states=['A', 'B'], ...)

class MyHSM(ASyncHSM):
   ...

这种方法的目标是实验性使用,因为在这种情况下,底层类不必是已知的。然而,类也可以直接从transitions.extensions导入。命名方案如下:
| | 图表|巢状|已锁定|阿森西奥|
| - -|- -|- -|- -|- -|
| 机器|✘| ✘| ✘| ✘|
| 图形机|✓| ✘| ✘| ✘|
| 分层计算机|✘| ✓| ✘| ✘|
| 已锁定计算机|✘| ✘| ✓| ✘|
| 分层图形机|✓| ✓| ✘| ✘|
| 锁定图形机|✓| ✘| ✓| ✘|
| 锁定的分层计算机|✘| ✓| ✓| ✘|
| 锁定的分层图形计算机|✓| ✓| ✓| ✘|
| 异步计算机|✘| ✘| ✘| ✓|
| 异步图形机|✓| ✘| ✘| ✓|
| 分层异步计算机|✘| ✓| ✘| ✓|
| 分层异步图形机|✓| ✓| ✘| ✓|
所以我猜这就是你要找的:

from transitions.extensions import HierarchicalAsyncMachine
# in case you want markup/graphviz support
from transitions.extensions import HierarchicalAsyncGraphMachine

如果你想“混合”你自己的机器类,看看factory.py,了解子类是如何定义的。注意继承的顺序。混合可能会导致不希望的效果。

相关问题