Upgrade to release 3.12.1:
- Restored the previous SyncToAsync.__call__ internal code shape,
which was relied on by some APM services.
From 3.12.0:
- AsyncToSync no longer captures the running event loop on
instantiation
- Fixed an event loop deadlock when exiting ThreadSensitiveContext
while its executor thread was still blocked waiting on the event
loop.
- Dropped support for EOL Python 3.9.
- Fixed StatelessServer.run() failing on Python 3.14, where
asyncio.get_event_loop() no longer creates an event loop if none
exists. It now uses asyncio.run().
- Fixed Local leaking data between unrelated sync threads when
sys.flags.thread_inherit_context is enabled (Python 3.14+), so a
newly started thread inherits a copy of the spawning thread's
context. This flag is on by default on free-threaded builds and
opt-in on the regular GIL build. Local storage is now tagged with
its owning thread and re-homed only when asgiref intentionally
moves work across threads (in async_to_sync / sync_to_async),
restoring the documented thread-local behaviour in sync threads.
Signed-off-by: Leon Anavi <leon.anavi@konsulko.com>
Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>