-
-
Notifications
You must be signed in to change notification settings - Fork 32k
gh-88110: clear concurrent.futures.thread._threads_queues after fork to avoid joining parent process' threads #126098
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
Conversation
… fork Threads are gone after fork, so clear the queues too. Otherwise the child process (here created via multiprocessing.Process) crashes on interpreter exit with: Traceback (most recent call last): File "/usr/lib64/python3.11/multiprocessing/popen_fork.py", line 72, in _launch code = process_obj._bootstrap(parent_sentinel=child_r) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib64/python3.11/multiprocessing/process.py", line 332, in _bootstrap threading._shutdown() File "/usr/lib64/python3.11/threading.py", line 1561, in _shutdown atexit_call() File "/usr/lib64/python3.11/concurrent/futures/thread.py", line 31, in _python_exit t.join() File "/usr/lib64/python3.11/threading.py", line 1109, in join raise RuntimeError("cannot join current thread") RuntimeError: cannot join current thread Fixes python#88110
Misc/NEWS.d/next/Library/2023-02-15-23-54-42.gh-issue-88110.KU6erv.rst
Outdated
Show resolved
Hide resolved
Co-authored-by: RUANG (James Roy) <[email protected]>
Friendly ping for this review, @rruuaanng Hopefully this one line of code can make it to main :) |
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.
Please silence the deprecation warning:
test_process_fork_from_a_threadpool (test.test_concurrent_futures.test_thread_pool.ThreadPoolExecutorTest.test_process_fork_from_a_threadpool) ... /home/serhiy/py/cpython-tmp/Lib/multiprocessing/popen_fork.py:67: DeprecationWarning: This process (pid=1243139) is multi-threaded, use of fork() may lead to deadlocks in the child.
self.pid = os.fork()
0.00s ok
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.
The test is failing.
Colonel Mustard did it in the Library with the Lead Pipe.
Thanks @Drino for the PR, and @serhiy-storchaka for merging it 🌮🎉.. I'm working now to backport this PR to: 3.12, 3.13. |
… fork to avoid joining parent process' threads (pythonGH-126098) Threads are gone after fork, so clear the queues too. Otherwise the child process (here created via multiprocessing.Process) crashes on interpreter exit. (cherry picked from commit 1848ce6) Co-authored-by: Andrei Bodrov <[email protected]> Co-authored-by: Serhiy Storchaka <[email protected]>
GH-127163 is a backport of this pull request to the 3.13 branch. |
… fork to avoid joining parent process' threads (pythonGH-126098) Threads are gone after fork, so clear the queues too. Otherwise the child process (here created via multiprocessing.Process) crashes on interpreter exit. (cherry picked from commit 1848ce6) Co-authored-by: Andrei Bodrov <[email protected]> Co-authored-by: Serhiy Storchaka <[email protected]>
GH-127164 is a backport of this pull request to the 3.12 branch. |
…r fork to avoid joining parent process' threads (GH-126098) (GH-127163) Threads are gone after fork, so clear the queues too. Otherwise the child process (here created via multiprocessing.Process) crashes on interpreter exit. (cherry picked from commit 1848ce6) Co-authored-by: Andrei Bodrov <[email protected]> Co-authored-by: Serhiy Storchaka <[email protected]>
…r fork to avoid joining parent process' threads (GH-126098) (GH-127164) Threads are gone after fork, so clear the queues too. Otherwise the child process (here created via multiprocessing.Process) crashes on interpreter exit. (cherry picked from commit 1848ce6) Co-authored-by: Andrei Bodrov <[email protected]> Co-authored-by: Serhiy Storchaka <[email protected]>
… fork to avoid joining parent process' threads (pythonGH-126098) Threads are gone after fork, so clear the queues too. Otherwise the child process (here created via multiprocessing.Process) crashes on interpreter exit. Co-authored-by: Serhiy Storchaka <[email protected]>
I've added a test to marmarek@ PR: #101940
_threads_queues
are copied as-is into the fork memory, but there are no threads in the child process, so child process crashes when callingt.join()
in_python_exit
.I'm facing this issue for the second time during last two years, so I hope it can be fixed :)