Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 34k
bpo-44050: Extension modules can share state when they don't support sub-interpreters.#27794
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
Uh oh!
There was an error while loading. Please reload this page.
Conversation
shihai1991 commented Aug 17, 2021 • edited by miss-islington
Loading Uh oh!
There was an error while loading. Please reload this page.
edited by miss-islington
Uh oh!
There was an error while loading. Please reload this page.
encukou commented Aug 17, 2021
I don't understand this PR. It allows Python objects to be shared between interpreters, doesn't it? |
shihai1991 commented Aug 17, 2021
Hi, petr. The details in this PR: 82c83bd |
encukou commented Aug 17, 2021 • edited
Loading Uh oh!
There was an error while loading. Please reload this page.
edited
Uh oh!
There was an error while loading. Please reload this page.
The relevant check is done by the |
shihai1991 commented Aug 17, 2021 • edited by bedevere-bot
Loading Uh oh!
There was an error while loading. Please reload this page.
edited by bedevere-bot
Uh oh!
There was an error while loading. Please reload this page.
Hm. I agree with you. But the user of bpo-44050 got the error in v3.9.6. And I found some module created from |
shihai1991 commented Aug 17, 2021
This PR can be removed when all the extension modules convert to multi-phase init. |
encukou commented Aug 17, 2021
Why is it important to ask whether the module was created by |
encukou commented Aug 17, 2021
That includes third-party modules, so: this PR can be removed when the API for single-phase init is removed. |
shihai1991 commented Aug 17, 2021
Make sure only the single extension module shared between interpreters. The extension module from multi-phase init can be created seperately in subinterpreter, right? |
encukou commented Aug 17, 2021
All modules with non-negative m_size shouldn't be shared across interpreters, regardless of how they're created. |
shihai1991 commented Aug 17, 2021
Make sense. Looks your idea would be better. Thanks:) I will update it soon. |
vstinner commented Aug 17, 2021
_PyImport_FixupExtensionObject() copies the namespace from the first instance of an extension, to newly created instances of the extension. It's better than using exactly the same module object with the same dict dictionary object. In a perfect world, all extensions would use multi-phase init and so don't go through _PyImport_FixupExtensionObject(). |
vstinner left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, but can you try to write an unit test?
Would it be possible to write an unit test for this? https://bugs.python.org/issue44050 is a regression. It would be better to not reintroduce it by mistake tomorrow.
Maybe using the ssl module: if if it's already imported, skip the test. Otherwise, spawn a subinterpreter to import it, and then import it in the main interpreter, and compare if you get the same objects or not.
See wee-slack/wee-slack#812 (comment) for a more complete example.
To make sure that the ssl module is not imported yet, you can run the test in a subprocess, eg. using assert_python_ok(), or subprocess.
shihai1991 commented Aug 17, 2021
OK, victor. I will update it. |
encukou commented Aug 18, 2021
That won't do; ssl uses multi-phase init (as should all other stdlib modules, one day). This would need to be a new module dedicated for the test. |
encukou commented Sep 7, 2021
Looks good, although it looks like it'll only be backported to 3.10.1. |
trygveaa commented Sep 7, 2021
What do you mean? The regression is in 3.9, the issue is fixed in 3.10, and 3.10.1 doesn't exist yet. Did you mean 3.9.1? |
shihai1991 commented Sep 7, 2021
Maybe we cloud backport to 3.9 and 3.10? |
Misc/NEWS.d/next/Core and Builtins/2021-09-08-00-30-09.bpo-44050.mFI15u.rst Outdated Show resolvedHide resolved
Uh oh!
There was an error while loading. Please reload this page.
encukou commented Oct 5, 2021
The "fix" in 3.10 is in the Backporting to 3.10.1 & the next 3.9 sounds fine. |
miss-islington commented Oct 5, 2021
@shihai1991: Status check is done, and it's a success ✅ . |
miss-islington commented Oct 5, 2021
Thanks @shihai1991 for the PR 🌮🎉.. I'm working now to backport this PR to: 3.9, 3.10. |
miss-islington commented Oct 5, 2021
Sorry, @shihai1991, I could not cleanly backport this to |
…sub-interpreters. (pythonGH-27794) Automerge-Triggered-By: GH:encukou (cherry picked from commit b9bb748) Co-authored-by: Hai Shi <shihai1992@gmail.com>
bedevere-bot commented Oct 5, 2021
GH-28738 is a backport of this pull request to the 3.10 branch. |
shihai1991 commented Oct 5, 2021
Thanks Petr, Victor for your review and merge. |
…pport sub-interpreters. (pythonGH-27794) Automerge-Triggered-By: GH:encukou. (cherry picked from commit b9bb748) Co-authored-by: Hai Shi <shihai1992@gmail.com>
bedevere-bot commented Oct 5, 2021
GH-28741 is a backport of this pull request to the 3.9 branch. |
encukou commented Oct 12, 2021
And thanks for your patience; this certainly waited for longer than it should have. |
https://bugs.python.org/issue44050
Automerge-Triggered-By: GH:encukou