René's URL Explorer Experiment


Title: gh-159963: Don't hold parent package import locks while a submodule executes by gpshead · Pull Request #159965 · python/cpython · GitHub

Open Graph Title: gh-159963: Don't hold parent package import locks while a submodule executes by gpshead · Pull Request #159965 · python/cpython

X Title: gh-159963: Don't hold parent package import locks while a submodule executes by gpshead · Pull Request #159965 · python/cpython

Description: Since gh-83065, the first import of pkg.mod kept pkg's module lock until pkg/mod.py had finished executing. This shipped in 3.15.0. Threads needing only the finished pkg were blocked for that long, and concurrent first imports could raise _DeadlockError or a spurious "partially initialized module" ImportError, or hang, with no import cycle involved. Parent packages are now imported, or waited for, before the submodule's lock is taken, and only that lock is held while it executes. The original gh-83065 deadlock stays fixed. importlib.import_module() now returns the partially initialized module in a cross-thread circular import, as the import statement already did, instead of raising _DeadlockError. This part is not the 3.15.0 regression: import_module() has raised _DeadlockError there since at least 3.12 (3.12, 3.13, 3.14 and main all do), so it can be judged separately for the backport. Two threads, step by step The scenario from test_concurrent_first_imports_of_sibling_packages: nothing is imported yet, a/leaf.py does from b.leaf import X and b/__init__.py does import a. The dependencies are a.leaf → b.leaf → b → a, so there is no import cycle. Thread 2 starts while thread 1 is still inside a/__init__.py. Before (3.15.0)After (this PR) sequenceDiagram participant T1 as Thread 1
import a.leaf participant T2 as Thread 2
import b.leaf Note over T1: 1. acquire locks a and a.leaf
run a/__init__.py Note over T2: 2. acquire locks b and b.leaf
run b/__init__.py (import a) T2-->>T1: 3. wait for lock a Note over T1: 4. a/__init__.py returns
lock a is NOT released
run a/leaf.py (from b.leaf import X) T1--xT2: 5. needs lock b.leaf, but T2 is waiting on T1 Note over T1: 6. _DeadlockError Loading sequenceDiagram participant T1 as Thread 1
import a.leaf participant T2 as Thread 2
import b.leaf Note over T1: 1. acquire lock a
run a/__init__.py Note over T2: 2. acquire lock b
run b/__init__.py (import a) T2-->>T1: 3. wait for lock a Note over T1: 4. a/__init__.py returns
release lock a Note over T1: 5. acquire lock a.leaf
run a/leaf.py (from b.leaf import X) Note over T2: 6. a is ready, b/__init__.py returns, release lock b
acquire lock b.leaf, run b/leaf.py T1-->>T2: 7. wait for lock b.leaf Note over T2: 8. release lock b.leaf
import b.leaf done Note over T1: 9. X imported, release lock a.leaf
import a.leaf done Loading Before, thread 1 keeps lock a after a/__init__.py has returned, so thread 2, which needs only the finished a, stays blocked while holding the locks thread 1 needs next. After, each thread holds one module lock at a time and both imports complete. Steps 5 to 8 of the right-hand side can interleave differently (thread 1 may load b.leaf itself); either way neither thread waits on a lock while holding one the other needs. authored using Claude Fable Issue: gh-159963

Open Graph Description: Since gh-83065, the first import of pkg.mod kept pkg's module lock until pkg/mod.py had finished executing. This shipped in 3.15.0. Threads needing only the finished pkg were blocked for that...

X Description: Since gh-83065, the first import of pkg.mod kept pkg's module lock until pkg/mod.py had finished executing. This shipped in 3.15.0. Threads needing only the finished pkg were blocked for ...

Opengraph URL: https://github.com/python/cpython/pull/159965

X: @github

direct link

Domain: github.com

react-profiling0
react-import-mapreact,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@d5750093facf
route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:2ed35c19-28a8-8b04-f1e2-018fde34c4f9
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idBDC4:36779:7A79FC:A5AFC5:6AED2D14
html-safe-nonce38a8ac17d2f4fbbe7132dc32f025c403a286a012e47a7381c63381996d8c8105
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCREM0OjM2Nzc5OjdBNzlGQzpBNUFGQzU6NkFFRDJEMTQiLCJ2aXNpdG9yX2lkIjoiMTY4OTI1NDA3MDAyMDAyNTYyMCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmacaa8ffd14c3fc89a1bdfe5a2396c2ad57a80e5dc1dde5f5c9ec729404a7034efa
hovercard-subject-tagpull_request:4943162131
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/python/cpython/pull/159965/files
twitter:imagehttps://avatars.githubusercontent.com/u/68491?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/68491?s=400&v=4
og:image:altSince gh-83065, the first import of pkg.mod kept pkg's module lock until pkg/mod.py had finished executing. This shipped in 3.15.0. Threads needing only the finished pkg were blocked for that...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
Nonee51d0b7b5ab34b1688c05b54c3ed17b8658b2fa9bca973a9c740683ccb12cf4a
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/python/cpython git https://github.com/python/cpython.git
octolytics-dimension-user_id1525981
octolytics-dimension-user_loginpython
octolytics-dimension-repository_id81598961
octolytics-dimension-repository_nwopython/cpython
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id81598961
octolytics-dimension-repository_network_root_nwopython/cpython
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release59ebb7b901cc154ecc179a44f266fcf69f343b30
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/python/cpython/pull/159965/files#start-of-content
https://github.com/
Sign inhttps://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fpython%2Fcpython%2Fpull%2F159965%2Ffiles
GitHubRepository hosting, code review, and collaborationhttps://github.com/platform
CopilotAI coding agent for tasks, projects, and automated workhttps://github.com/features/copilot
ActionsCI/CD and automationhttps://github.com/features/actions
Code QualityQuality analysis, fixes, and enforcementhttps://github.com/features/code-quality
CodespacesCloud development environmentshttps://github.com/features/codespaces
Code SecurityVulnerability detection and remediationhttps://github.com/security/advanced-security/code-security
Secret ProtectionSecret scanning and leak preventionhttps://github.com/security/advanced-security/secret-protection
All Featureshttps://github.com/features
Documentationhttps://docs.github.com/en
Traininghttps://learn.github.com/skills
Certificationshttps://learn.github.com/credentials
Build with Copilothttps://github.com/features/ai
Customize Copilothttps://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-copilot-overview
Integrationshttps://github.com/marketplace
Trending reposhttps://github.com/trending
GitHub Sponsorshttps://github.com/open-source/sponsors
Developer articleshttps://github.com/resources/articles
ChangelogYour source for the latest features, improvements, and fixes across GitHub products, all in one place.https://github.blog/changelog/
Enterpriseshttps://github.com/enterprise
Teamhttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
See all industrieshttps://github.com/solutions/industry
Why GitHubhttps://github.com/why-github
Customer Storieshttps://github.com/customer-stories
Business insightshttps://github.com/solutions/executive-insights
Trust Centerhttps://github.com/trust-center
GitHub Advanced SecurityEnterprise-grade code securityhttps://github.com/security/advanced-security
Copilot for businessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Documentationhttps://docs.github.com/en
Resource centerhttps://github.com/resources
Bloghttps://github.blog/
Events & webinarshttps://github.com/resources/events
Community Forumhttps://github.com/orgs/community/discussions
Customer Storieshttps://github.com/customer-stories
Integrationshttps://github.com/marketplace
Customer supporthttps://help.github.com/
Traininghttps://learn.github.com/skills
GitHub Statushttps://www.githubstatus.com/
Abouthttps://github.com/about
Partnershttps://github.com/partners
Changeloghttps://github.blog/changelog/
GitHub UniverseThe event for developers, by developers — talks, workshops, and what’s next for GitHub.https://githubuniverse.com/
Pricinghttps://github.com/pricing
Sign inhttps://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fpython%2Fcpython%2Fpull%2F159965%2Ffiles
Sign uphttps://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=python%2Fcpython
Reloadhttps://github.com/python/cpython/pull/159965/files
Reloadhttps://github.com/python/cpython/pull/159965/files
Reloadhttps://github.com/python/cpython/pull/159965/files
pythonhttps://github.com/python
cpythonhttps://github.com/python/cpython
Codehttps://github.com/python/cpython
Issues5k+ (5k+)https://github.com/python/cpython/issues
Pull requests2.3k (2.3k)https://github.com/python/cpython/pulls
Actionshttps://github.com/python/cpython/actions
Projectshttps://github.com/python/cpython/projects
Security and qualityhttps://github.com/python/cpython/security
Insightshttps://github.com/python/cpython/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fpython%2Fcpython%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fpython%2Fcpython%2Fissues%2Fnew%2Fchoose
gpsheadhttps://github.com/gpshead
python:mainhttps://github.com/python/cpython/tree/main
gpshead:import-parent-locks-regressionhttps://github.com/gpshead/cpython/tree/import-parent-locks-regression
Conversation 17 https://github.com/python/cpython/pull/159965
Commits 8 https://github.com/python/cpython/pull/159965/commits
Checks 53 https://github.com/python/cpython/pull/159965/checks
Files changed https://github.com/python/cpython/pull/159965/files
Please reload this pagehttps://github.com/python/cpython/pull/159965/files
gh-159963: Don't hold parent package import locks while a submodule executes https://github.com/python/cpython/pull/159965/files#top
Show all changes 8 commits https://github.com/python/cpython/pull/159965/files
fea385a gh-159963: Don't hold parent package import locks while a submodule e… gpshead Oct 20, 2026 https://github.com/python/cpython/pull/159965/commits/fea385a6e9ca69417a49c3318c7308155bef208d
7449736 Simplify the NEWS, What's New and comment wording gpshead Oct 21, 2026 https://github.com/python/cpython/pull/159965/commits/74497369597a8119bb77f85b31a36bb5ff7c9741
5d2a312 Merge branch 'main' into import-parent-locks-regression gpshead Oct 21, 2026 https://github.com/python/cpython/pull/159965/commits/5d2a3128a6abc970cdc479654759d5312c797679
f4070d1 drop the What's New entry gpshead Oct 21, 2026 https://github.com/python/cpython/pull/159965/commits/f4070d175c54ad1120dc5f18863682c5a4a3b22c
a1269ba Remove two tests that duplicate coverage of others gpshead Oct 22, 2026 https://github.com/python/cpython/pull/159965/commits/a1269ba83705c877e37e93b79085725c9fa72229
48734db Test the import of a parent package removed before its submodule loads gpshead Oct 22, 2026 https://github.com/python/cpython/pull/159965/commits/48734dbc5ce63cb19671cbe48d1e20e30cd33b92
8d87716 Use comments rather than docstrings for internal helpers gpshead Oct 22, 2026 https://github.com/python/cpython/pull/159965/commits/8d8771643aa4a8b22841e95ffc80486b38a92f88
e0982d9 Don't return a module another thread has begun loading again gpshead Oct 23, 2026 https://github.com/python/cpython/pull/159965/commits/e0982d9b185f8d5a6ed109fdc81cd47025ff14a2
Clear filters https://github.com/python/cpython/pull/159965/files
Please reload this pagehttps://github.com/python/cpython/pull/159965/files
Please reload this pagehttps://github.com/python/cpython/pull/159965/files
_bootstrap.py https://github.com/python/cpython/pull/159965/files#diff-dba786ae26d5505c4c367a93b1179c2f80f2433d983b84bacb9001fb552f0761
test_packages.py https://github.com/python/cpython/pull/159965/files#diff-ae90d99527180da8a998364071ed5fac8db7b6fb3ae2b032fc8fc1328e8d6046
test_threaded_import.py https://github.com/python/cpython/pull/159965/files#diff-a1e554f578aaaf3a7232078affdd527a19c86b178d8e3df84de287d335804ab1
2026-10-20-22-00-00.gh-issue-159963.pLkHld.rst https://github.com/python/cpython/pull/159965/files#diff-0b6113cb0eab462fe618ab5655f2be1fd9c39e8fc5dce995171f49afc64e70c5
https://github.com/python/cpython/blob/main/.github/CODEOWNERS#L261
Lib/importlib/_bootstrap.pyhttps://github.com/python/cpython/pull/159965/files#diff-dba786ae26d5505c4c367a93b1179c2f80f2433d983b84bacb9001fb552f0761
View file https://github.com/gpshead/cpython/blob/e0982d9b185f8d5a6ed109fdc81cd47025ff14a2/Lib/importlib/_bootstrap.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/python/cpython/pull/159965/{{ revealButtonHref }}
https://github.com/python/cpython/pull/159965/files#diff-dba786ae26d5505c4c367a93b1179c2f80f2433d983b84bacb9001fb552f0761
https://github.com/python/cpython/pull/159965/files#diff-dba786ae26d5505c4c367a93b1179c2f80f2433d983b84bacb9001fb552f0761
https://github.com/python/cpython/pull/159965/files#diff-dba786ae26d5505c4c367a93b1179c2f80f2433d983b84bacb9001fb552f0761
https://github.com/python/cpython/pull/159965/files#diff-dba786ae26d5505c4c367a93b1179c2f80f2433d983b84bacb9001fb552f0761
https://github.com/python/cpython/pull/159965/files#diff-dba786ae26d5505c4c367a93b1179c2f80f2433d983b84bacb9001fb552f0761
Please reload this pagehttps://github.com/python/cpython/pull/159965/files
https://github.com/python/cpython/pull/159965/files#diff-dba786ae26d5505c4c367a93b1179c2f80f2433d983b84bacb9001fb552f0761
https://github.com/python/cpython/blob/main/.github/CODEOWNERS#L261
Lib/test/test_importlib/import_/test_packages.pyhttps://github.com/python/cpython/pull/159965/files#diff-ae90d99527180da8a998364071ed5fac8db7b6fb3ae2b032fc8fc1328e8d6046
View file https://github.com/gpshead/cpython/blob/e0982d9b185f8d5a6ed109fdc81cd47025ff14a2/Lib/test/test_importlib/import_/test_packages.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/python/cpython/pull/159965/{{ revealButtonHref }}
https://github.com/python/cpython/pull/159965/files#diff-ae90d99527180da8a998364071ed5fac8db7b6fb3ae2b032fc8fc1328e8d6046
https://github.com/python/cpython/pull/159965/files#diff-ae90d99527180da8a998364071ed5fac8db7b6fb3ae2b032fc8fc1328e8d6046
https://github.com/python/cpython/pull/159965/files#diff-ae90d99527180da8a998364071ed5fac8db7b6fb3ae2b032fc8fc1328e8d6046
Please reload this pagehttps://github.com/python/cpython/pull/159965/files
Please reload this pagehttps://github.com/python/cpython/pull/159965/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.