Skip to content

Conversation

@ericsnowcurrently
Copy link
Member

@ericsnowcurrentlyericsnowcurrently commented May 19, 2023

(This should solve the semi-frequent buildbot failures we've been seeing.)

In Py_EndInterpreter() we almost immediately wait for all non-daemon Python threads to finish, by calling theading._shutdown(). However, with a per-interpreter GIL there's a race because threading._shutdown() doesn't wait long enough. This change fixes that by making sure _PyThreadState_DeleteCurrent()completely finishes before releasing the lock on which threading._shutdown() depends.

The gist of it is that we release that lock (and clean it up) later than we would normally be able to, by doing the cleanup in another thread via a "pending" call.

This isn't an ideal solution, but other approaches I tried involved more invasive changes, which I'd like to avoid this close to the beta 1 release.

@ericsnowcurrently
Copy link
MemberAuthor

I plan on revisiting this problem, to introduce a better long-term solution. However, that probably won't be in 3.12.

@ericsnowcurrentlyericsnowcurrentlyforce-pushed the fix-threading-module-shutdown-simpler branch from 6c79a9b to 8b42a15CompareMay 23, 2023 21:00
@ericsnowcurrentlyericsnowcurrently marked this pull request as ready for review May 23, 2023 21:01
@markshannon
Copy link
Member

Ae you still going with this, or has it been superseded?

@ericsnowcurrently
Copy link
MemberAuthor

It's superseded for the moment. I'm likely to revisit this for 3.13.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@ericsnowcurrently@markshannon@bedevere-bot