You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Breaking Changes
App-tier bus handlers now default to single execution mode — a trigger that fires while a prior invocation of the same handler is still running is dropped instead of running concurrently. Apps that rely on overlapping invocations must pass mode="parallel" on the registration (e.g. self.bus.on_state_change(..., mode="parallel")). Framework-tier listeners are unchanged and still default to parallel. (#1028)
Execution Overlap Modes
Bus handlers gain per-listener overlap modes — single (drop the re-fire), restart (cancel and replace), queued (serialize), and parallel (run concurrently) — controlling what happens when a handler is re-triggered while still running. App-tier defaults to single; framework-tier to parallel. (#1028)
Scheduled jobs gain the same overlap modes via a mode= parameter on run_in, run_once, run_every, run_daily, and run_cron. Framework jobs default to parallel, app jobs to single. (#1046)
Event Loop Protection
Sync handlers now run on a dedicated, isolated thread pool, so a slow or timed-out handler can no longer starve framework internals like logging and the database. Tune the pool with the new sync_executor_max_workers config. (#1042)
Blocking I/O run directly on the shared event loop (e.g. time.sleep, requests.get, blocking open().read()) is now detected, attributed to the offending app, and logged. Control it with blocking_io_behavior globally or per-app, or set it to "ignore" to disable. (#1040)