I want to build a stat machine such that it can posses features of both HierarchicalMachine and AsyncMachine. I tried this code but Hierarchical and Async are not working simultaneously.
`
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:
RuntimeError: AsyncMachine should not call Machine._process
. Use Machine._process_async
instead.'