Skip to content

Commit fd76b47

Browse files
committed
refactor: directly run _handle_finish_event in the store event loop when FinishEvent is dispatched, previously it used to be a normal subscribe_event, events registered in subscribe_event run in SideEffectRunnerThread and it runs them with the task_runner, and there is no guarantee task_runner runs tasks after FinishEvent is dispatched
1 parent 0877b64 commit fd76b47

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
- test: make sure pytest exits completely after running async tests
66
- refactor: in `_wait_for_store_to_finish`, instead of waiting with `asyncio.sleep`, run the store event loop when conditions are not satisfied
7+
- refactor: directly run `_handle_finish_event` in the store event loop when `FinishEvent` is dispatched, previously it used to be a normal `subscribe_event`, events registered in `subscribe_event` run in `SideEffectRunnerThread` and it runs them with the `task_runner`, and there is no guarantee `task_runner` runs tasks after `FinishEvent` is dispatched
78

89
## Version 0.21.1
910

redux/main.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,6 @@ def __init__(
108108

109109
self._is_running = Lock()
110110

111-
self.subscribe_event(FinishEvent, self._handle_finish_event)
112-
113111
if self.store_options.auto_init:
114112
if self.store_options.scheduler:
115113
self.store_options.scheduler(
@@ -155,6 +153,8 @@ def _run_event_handlers(self: Store[State, Action, Event]) -> None:
155153
while len(self._events) > 0:
156154
event = self._events.pop(0)
157155
if event is not None:
156+
if isinstance(event, FinishEvent):
157+
self._handle_finish_event()
158158
for event_handler in self._event_handlers[type(event)].copy():
159159
self._event_handlers_queue.put_nowait((event_handler, event))
160160

@@ -245,15 +245,20 @@ def _subscribe(
245245
keep_ref: bool = True,
246246
) -> Callable[[], None]:
247247
"""Subscribe to state changes."""
248+
249+
def unsubscribe(_: weakref.ref | None = None) -> None:
250+
return self._listeners.remove(listener_ref)
251+
248252
if keep_ref:
249253
listener_ref = listener
250254
elif inspect.ismethod(listener):
251-
listener_ref = weakref.WeakMethod(listener)
255+
listener_ref = weakref.WeakMethod(listener, unsubscribe)
252256
else:
253-
listener_ref = weakref.ref(listener)
257+
listener_ref = weakref.ref(listener, unsubscribe)
254258

255259
self._listeners.add(listener_ref)
256-
return lambda: self._listeners.remove(listener_ref)
260+
261+
return unsubscribe
257262

258263
def subscribe_event(
259264
self: Store[State, Action, Event],
@@ -292,7 +297,7 @@ def _wait_for_store_to_finish(self: Store[State, Action, Event]) -> None:
292297
if self.store_options.on_finish:
293298
self.store_options.on_finish()
294299
break
295-
time.sleep(0.1)
300+
self.run()
296301

297302
def _handle_finish_event(self: Store[State, Action, Event]) -> None:
298303
Thread(target=self._wait_for_store_to_finish).start()

0 commit comments

Comments
 (0)