-
-
Notifications
You must be signed in to change notification settings - Fork 30.5k
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
Add a Check for Extensions that Support Running in Subinterpreters #98627
Comments
CC @encukou |
A possible implementation: main...ericsnowcurrently:extensions-check-per-interpreter-gil-compatibility |
This helps simplify some changes in follow-up PRs. It also matches what we're doing in PyModule_ExecDef().
Without per-interpreter GIL, I don't think the slot (and check) is worth the effort. Another point: some people did things correctly, despite lack of good guidance, and it's not nice to ask them to reassert that their extension supports multiple interpreters, when they already did that with multi-phase initialization.
Yes, this needs to be false for backwards compatibility. Perhaps with an |
…98734) This helps simplify some changes in follow-up PRs. It also matches what we're doing in PyModule_ExecDef().
Fine with me. I guess I misunderstood something you said elsewhere.
Agreed.
I'd consider "isolated" to match multiple interpreter support. Something like "Py_mod_thread_safe" or seems more clear for a per-interpreter GIL.
Agreed.
Yeah, I'm not sure why I put "(maybe)". I was probably thinking of saving folks like cryptography from headache. However, that would be too disruptive for legacy users.
Good idea. I'll look into that. |
…ompatibility (gh-99040) Enforcing (optionally) the restriction set by PEP 489 makes sense. Furthermore, this sets the stage for a potential restriction related to a per-interpreter GIL. This change includes the following: * add tests for extension module subinterpreter compatibility * add _PyInterpreterConfig.check_multi_interp_extensions * add Py_RTFLAGS_MULTI_INTERP_EXTENSIONS * add _PyImport_CheckSubinterpIncompatibleExtensionAllowed() * fail iff the module does not implement multi-phase init and the current interpreter is configured to check #98627
Any given extension module may or may not support being loaded in multiple interpreters. This primarily depends on whether or not the extension use any process-global state. When imported in multiple interpreters at the same time, a module that does not isolate its state may lead to problems.
Global state (which must be isolated) includes:
If an extension properly implements multi-phase init (PEP 489) then it probably does support use in multiple interpreters (but not necessarily under per-interpreter GIL). In fact, PEP 489 proscribes this.
It would be useful to add a check to the
ExtensionFileLoader
to this effect.Proposal
ImportError
Configuration
Given a
_PyInterpreterConfig
(see gh-98608), we would add something like_PyInterpreterConfig.check_multi_interp_extensions
to indicate that the interpreter created via_PyInterpreterNewFromConfig()
should do the check or not.For backward compatibility, we'd use the following defaults:
Py_NewInterpreter()
_xxsubinterpreters
module, PEPs 554, 684)For
Py_NewInterpreter()
it may make sense to default to "true", to avoid causing folks headaches (see pyca/cryptography#2299). However, we'll probably want to stick with "false" under the assumption that most extensions work well enough in multiple interpreters to allow us to preserve compatibility.A Module Def Slot
Per PEP 684 discussions, there is some uncertainty about how confident extension authors may be about how isolated their extensions really are. If this is a genuine concern then we should consider also adding a PEP 489 module def slot, e.g.
Py_mod_subinterpreters
, to allow extension authors to opt in to supporting multiple interpreters. It would probably also make sense to offer a slot to opt out of multiple interpreter support, e.g.Py_mod_no_subinterpreters
, for when support is more wide-spread.Again, this only makes sense if we aren't confident that multi-phase init support is an adequate indicator.
Per-Interpreter GIL (PEP 684)
There are additional static variables, e.g. temporary buffers, that factor in to extension "isolation" if you drop the thread safety provided by the GIL. This is real concern relative to PEP 684, where we would make the GIL per-interpreter. The difference between isolation is relatively small, but enough to warrant consideration.
Most notably, a per-interpreter GIL would strengthen the value of a dedicated module def slot.
The text was updated successfully, but these errors were encountered: