gh-104341: Wait Completely at threading._shutdown()#104672
Closed
Uh oh!
There was an error while loading. Please reload this page.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
(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 callingtheading._shutdown(). However, with a per-interpreter GIL there's a race becausethreading._shutdown()doesn't wait long enough. This change fixes that by making sure_PyThreadState_DeleteCurrent()completely finishes before releasing the lock on whichthreading._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.