-
-
Notifications
You must be signed in to change notification settings - Fork 32k
warnings.catch_warnings is not thread safe or async safe #128384
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Labels
stdlib
Python modules in the Lib dir
topic-asyncio
topic-free-threading
type-bug
An unexpected behavior, bug, or error
Comments
This was referenced Dec 31, 2024
nascheme
added a commit
that referenced
this issue
Jan 14, 2025
Co-authored-by: Kumar Aditya <[email protected]>
nascheme
added a commit
to nascheme/cpython
that referenced
this issue
Feb 12, 2025
nascheme
added a commit
to nascheme/cpython
that referenced
this issue
Feb 21, 2025
nascheme
added a commit
to nascheme/cpython
that referenced
this issue
Mar 11, 2025
nascheme
added a commit
to nascheme/cpython
that referenced
this issue
Mar 27, 2025
nascheme
added a commit
to nascheme/cpython
that referenced
this issue
Mar 27, 2025
nascheme
added a commit
to nascheme/cpython
that referenced
this issue
Mar 27, 2025
nascheme
added a commit
to nascheme/cpython
that referenced
this issue
Apr 9, 2025
nascheme
added a commit
that referenced
this issue
Apr 9, 2025
) Make `warnings.catch_warnings()` use a context variable for holding the warning filtering state if the `sys.flags.context_aware_warnings` flag is set to true. This makes using the context manager thread-safe in multi-threaded programs. Add the `sys.flags.thread_inherit_context` flag. If true, starting a new thread with `threading.Thread` will use a copy of the context from the caller of `Thread.start()`. Both these flags are set to true by default for the free-threaded build and false for the default build. Move the Python implementation of warnings.py into _py_warnings.py. Make _contextvars a builtin module. Co-authored-by: Kumar Aditya <[email protected]>
Fixed by GH-130010. You have to set the |
seehwan
pushed a commit
to seehwan/cpython
that referenced
this issue
Apr 16, 2025
…ythongh-130010) Make `warnings.catch_warnings()` use a context variable for holding the warning filtering state if the `sys.flags.context_aware_warnings` flag is set to true. This makes using the context manager thread-safe in multi-threaded programs. Add the `sys.flags.thread_inherit_context` flag. If true, starting a new thread with `threading.Thread` will use a copy of the context from the caller of `Thread.start()`. Both these flags are set to true by default for the free-threaded build and false for the default build. Move the Python implementation of warnings.py into _py_warnings.py. Make _contextvars a builtin module. Co-authored-by: Kumar Aditya <[email protected]>
hugovk
added a commit
to hugovk/cpython
that referenced
this issue
Apr 16, 2025
…rnings (pythongh-130010)" This reverts commit d687900.
nascheme
added a commit
to nascheme/cpython
that referenced
this issue
Apr 16, 2025
nascheme
added a commit
that referenced
this issue
Apr 16, 2025
When the `showwarning()` function is replaced, make sure to restore it after the test finishes. Add a timeout for `Barrier()` so we don't hang for a long time if something goes wrong.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Labels
stdlib
Python modules in the Lib dir
topic-asyncio
topic-free-threading
type-bug
An unexpected behavior, bug, or error
Bug report
Bug description:
This is an old issue but it has become more urgent to fix given free-threaded Python. A simple example to show how the current context manager can fail:
Since
test_warning()
is running in separate threads, there is no consistent ordering of which context manager exits first. That means the filters value that gets restored is also not consistent (a race between the threads about which version of the filters value they will restore).The context manager is also not friendly to async code. These issues have been reported before:
The fairly obvious fix to this issue is to use
contextvars
, similar to how thedecimal
module uses a context. This is both thread safe and friendly to async code.The
warnings
module itself has some "shallow" thread safety issues but these are relatively easy to fix and no API changes are needed.CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs
The text was updated successfully, but these errors were encountered: