Title: Add a Check for Extensions that Support Running in Subinterpreters · Issue #98627 · python/cpython · GitHub
Open Graph Title: Add a Check for Extensions that Support Running in Subinterpreters · Issue #98627 · python/cpython
X Title: Add a Check for Extensions that Support Running in Subinterpreters · Issue #98627 · python/cpython
Description: 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 modu...
Open Graph Description: 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 multip...
X Description: 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 multip...
Opengraph URL: https://github.com/python/cpython/issues/98627
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Add a Check for Extensions that Support Running in Subinterpreters","articleBody":"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.\r\n\r\nGlobal state (which must be isolated) includes:\r\n\r\n* Python objects the extension uses (including internally)\r\n* other data it uses directly\r\n* indirect state, via linked libraries\r\n\r\nIf 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.\r\n\r\nIt would be useful to add a check to the `ExtensionFileLoader` to this effect.\r\n\r\n## Proposal\r\n\r\n* if an extension is imported in a sub-interpreter and it does not implement multi-phase init then we should raise `ImportError`\r\n* this should be configurable on a per-interpreter basis\r\n* the default is debatable\r\n* we may want to allow multi-phase init extension to opt in to multiple interpreter support\r\n* (there are some additional minor considerations if we factor in a per-interpreter GIL)\r\n\r\n### Configuration\r\n\r\nGiven 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.\r\n\r\nFor backward compatibility, we'd use the following defaults:\r\n\r\n* \"false\" for the main interpreter\r\n* **(maybe)** \"false\" for the legacy `Py_NewInterpreter()`\r\n* \"true\" for \"isolated\" interpreters (see the `_xxsubinterpreters` module, PEPs 554, 684)\r\n\r\nFor `Py_NewInterpreter()` it may make sense to default to \"true\", to avoid causing folks headaches (see https://github.com/pyca/cryptography/issues/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.\r\n\r\n## A Module Def Slot\r\n\r\nPer 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.\r\n\r\nAgain, this only makes sense if we aren't confident that multi-phase init support is an adequate indicator.\r\n\r\n## Per-Interpreter GIL (PEP 684)\r\n\r\nThere 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.\r\n\r\nMost notably, a per-interpreter GIL would strengthen the value of a dedicated module def slot.\n\n\u003c!-- gh-pr-number: gh-99039 --\u003e\n* PR: gh-99039\n\u003c!-- /gh-pr-number --\u003e\n\n\n\u003c!-- gh-pr-number: gh-99040 --\u003e\n* PR: gh-99040\n\u003c!-- /gh-pr-number --\u003e\n","author":{"url":"https://github.com/ericsnowcurrently","@type":"Person","name":"ericsnowcurrently"},"datePublished":"2022-10-24T21:59:52.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":4},"url":"https://github.com/98627/cpython/issues/98627"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:d35f2464-ceed-78f2-e5b0-3bb525d083b7 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | D23A:34359D:12B3F95:1A44A5C:696A3C51 |
| html-safe-nonce | 57ca81d5171a0445d03e4f60fe02677c28d02feeb60d526761ee268b7aac5849 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEMjNBOjM0MzU5RDoxMkIzRjk1OjFBNDRBNUM6Njk2QTNDNTEiLCJ2aXNpdG9yX2lkIjoiNDAxMDQ4MTkxODM1MDYwNTM5MyIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | e1920da1f8d1989e3b03be2a67ca960460ce7cb5cf798405fd75ca961a4db8c3 |
| hovercard-subject-tag | issue:1421511882 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/98627/issue_layout |
| twitter:image | https://opengraph.githubassets.com/f717be3d7d815b0933d2fda9e53b51b9348906547f7bdc4b3650082fca7c889f/python/cpython/issues/98627 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/f717be3d7d815b0933d2fda9e53b51b9348906547f7bdc4b3650082fca7c889f/python/cpython/issues/98627 |
| og:image:alt | 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 multip... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | ericsnowcurrently |
| hostname | github.com |
| expected-hostname | github.com |
| None | 321736bfdb3f591415ae895a0459bec204b26a76caf47ba5c980634cfacc4538 |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 13581a31d51edf4a3aca179e10890a4d4f9b6d76 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width