prevent multiple iterations over the state tree when serializing touched states
This commit is contained in:
parent
6d6a7b8db0
commit
604e96a52d
@ -1515,6 +1515,39 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
|
|||||||
loaded_substates[substate.get_full_name()] = substate
|
loaded_substates[substate.get_full_name()] = substate
|
||||||
substate._get_loaded_substates(loaded_substates)
|
substate._get_loaded_substates(loaded_substates)
|
||||||
|
|
||||||
|
def _serialize_touched_states(self) -> dict[str, bytes]:
|
||||||
|
"""Serialize all touched states in the state tree.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The serialized states.
|
||||||
|
"""
|
||||||
|
root_state = self._get_root_state()
|
||||||
|
d = {}
|
||||||
|
if root_state._get_was_touched():
|
||||||
|
serialized = root_state._serialize()
|
||||||
|
if serialized:
|
||||||
|
d[root_state.get_full_name()] = serialized
|
||||||
|
root_state._serialize_touched_substates(d)
|
||||||
|
return d
|
||||||
|
|
||||||
|
def _serialize_touched_substates(
|
||||||
|
self,
|
||||||
|
touched_substates: dict[str, bytes],
|
||||||
|
) -> None:
|
||||||
|
"""Serialize all touched substates of this state.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
touched_substates: A dictionary of touched substates which will be updated with the substates of this state.
|
||||||
|
"""
|
||||||
|
for substate in self.substates.values():
|
||||||
|
substate._serialize_touched_substates(touched_substates)
|
||||||
|
if not substate._get_was_touched():
|
||||||
|
continue
|
||||||
|
serialized = substate._serialize()
|
||||||
|
if not serialized:
|
||||||
|
continue
|
||||||
|
touched_substates[substate.get_full_name()] = serialized
|
||||||
|
|
||||||
def _get_root_state(self) -> BaseState:
|
def _get_root_state(self) -> BaseState:
|
||||||
"""Get the root state of the state tree.
|
"""Get the root state of the state tree.
|
||||||
|
|
||||||
@ -3464,15 +3497,7 @@ class StateManagerRedis(StateManager):
|
|||||||
f"Cannot `set_state` with mismatching token {token} and substate {state.get_full_name()}."
|
f"Cannot `set_state` with mismatching token {token} and substate {state.get_full_name()}."
|
||||||
)
|
)
|
||||||
|
|
||||||
redis_hashset = {}
|
redis_hashset = state._serialize_touched_states()
|
||||||
|
|
||||||
for state_name, substate in state._get_loaded_states().items():
|
|
||||||
if not substate._get_was_touched():
|
|
||||||
continue
|
|
||||||
pickle_state = substate._serialize()
|
|
||||||
if not pickle_state:
|
|
||||||
continue
|
|
||||||
redis_hashset[state_name] = pickle_state
|
|
||||||
|
|
||||||
if not redis_hashset:
|
if not redis_hashset:
|
||||||
return
|
return
|
||||||
|
Loading…
Reference in New Issue
Block a user