Skip to content

Commit 456faf3

Browse files
committed
refac: Improved support for pickle and deepcopy
1 parent e16e0ef commit 456faf3

File tree

2 files changed

+11
-21
lines changed

2 files changed

+11
-21
lines changed

statemachine/engines/base.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,19 @@ class BaseEngine:
1717
def __init__(self, sm: "StateMachine", rtc: bool = True):
1818
self.sm: StateMachine = proxy(sm)
1919
self._external_queue: deque = deque()
20+
self._processing = Lock()
2021
self._sentinel = object()
2122
self._rtc = rtc
22-
self._processing = Lock()
23+
24+
def __getstate__(self) -> dict:
25+
state = self.__dict__.copy()
26+
del state["_external_queue"]
27+
del state["_processing"]
28+
del state["sm"]
29+
return state
30+
31+
def __setstate__(self, state: dict) -> None:
32+
self.__dict__.update(state)
2333

2434
def put(self, trigger_data: TriggerData):
2535
"""Put the trigger on the queue without blocking the caller."""

statemachine/statemachine.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import warnings
2-
from copy import deepcopy
32
from inspect import isawaitable
4-
from threading import Lock
53
from typing import TYPE_CHECKING
64
from typing import Any
75
from typing import Dict
@@ -129,24 +127,6 @@ def __repr__(self):
129127
f"current_state={current_state_id!r})"
130128
)
131129

132-
def __deepcopy__(self, memo):
133-
deepcopy_method = self.__deepcopy__
134-
lock = self._engine._processing
135-
with lock:
136-
self.__deepcopy__ = None
137-
self._engine._processing = None
138-
try:
139-
cp = deepcopy(self, memo)
140-
cp._engine._processing = Lock()
141-
finally:
142-
self.__deepcopy__ = deepcopy_method
143-
cp.__deepcopy__ = deepcopy_method
144-
self._engine._processing = lock
145-
cp._callbacks.clear()
146-
cp._register_callbacks([])
147-
cp.add_listener(*cp._listeners.keys())
148-
return cp
149-
150130
def __getstate__(self):
151131
state = self.__dict__.copy()
152132
state["_rtc"] = self._engine._rtc

0 commit comments

Comments
 (0)