From 2a5ba3eab646b75b419dc7f57b7af5ed4efc43db Mon Sep 17 00:00:00 2001 From: Yash Date: Sun, 16 Nov 2025 15:11:06 +0530 Subject: [PATCH 1/6] gh-141617: Add missing result() call in concurrent.futures example --- Doc/library/concurrent.futures.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index c2e2f7f820f4ef..7cad0fd1473c35 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -151,7 +151,7 @@ And:: print(f.result()) executor = ThreadPoolExecutor(max_workers=1) - executor.submit(wait_on_future) + executor.submit(wait_on_future).result() .. class:: ThreadPoolExecutor(max_workers=None, thread_name_prefix='', initializer=None, initargs=()) From 6dd6b65fe5a1bdd2b30625dac0811c14268bd504 Mon Sep 17 00:00:00 2001 From: Yash Date: Mon, 17 Nov 2025 15:50:05 +0530 Subject: [PATCH 2/6] gh-141617: Clarify ThreadPoolExecutor deadlock example in docs --- Doc/library/concurrent.futures.rst | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 7cad0fd1473c35..ec56a361b89a51 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -40,7 +40,9 @@ Executor Objects with ThreadPoolExecutor(max_workers=1) as executor: future = executor.submit(pow, 323, 1235) print(future.result()) - + # Note: calling future.result() outside this with statement would work fine, + # but calling it here is safe because we print it immediately and the executor + # can complete the task before the context manager exits. .. method:: map(fn, *iterables, timeout=None, chunksize=1, buffersize=None) Similar to :func:`map(fn, *iterables) ` except: @@ -152,7 +154,9 @@ And:: executor = ThreadPoolExecutor(max_workers=1) executor.submit(wait_on_future).result() - + # Note: calling future.result() here would cause a deadlock because the single + # worker thread is already executing wait_on_future(), which itself is waiting + # for a result from the same executor. .. class:: ThreadPoolExecutor(max_workers=None, thread_name_prefix='', initializer=None, initargs=()) From db9803138b688f73547c486d93e9a79a731a47ec Mon Sep 17 00:00:00 2001 From: Yash Date: Wed, 3 Dec 2025 00:09:51 +0530 Subject: [PATCH 3/6] Address review feedback: remove incorrect comments and fix deadlock example --- Doc/library/concurrent.futures.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index ec56a361b89a51..bd8021e3faf9c1 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -40,9 +40,8 @@ Executor Objects with ThreadPoolExecutor(max_workers=1) as executor: future = executor.submit(pow, 323, 1235) print(future.result()) - # Note: calling future.result() outside this with statement would work fine, - # but calling it here is safe because we print it immediately and the executor - # can complete the task before the context manager exits. + + .. method:: map(fn, *iterables, timeout=None, chunksize=1, buffersize=None) Similar to :func:`map(fn, *iterables) ` except: @@ -153,7 +152,7 @@ And:: print(f.result()) executor = ThreadPoolExecutor(max_workers=1) - executor.submit(wait_on_future).result() + executor.submit(wait_on_future) # Note: calling future.result() here would cause a deadlock because the single # worker thread is already executing wait_on_future(), which itself is waiting # for a result from the same executor. From 3ac31146d16d9e5e40aa21f43dea180fe64a33db Mon Sep 17 00:00:00 2001 From: Yash Date: Wed, 3 Dec 2025 00:12:12 +0530 Subject: [PATCH 4/6] changes --- Doc/library/concurrent.futures.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index bd8021e3faf9c1..d774155e8efb33 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -40,8 +40,8 @@ Executor Objects with ThreadPoolExecutor(max_workers=1) as executor: future = executor.submit(pow, 323, 1235) print(future.result()) - - + + .. method:: map(fn, *iterables, timeout=None, chunksize=1, buffersize=None) Similar to :func:`map(fn, *iterables) ` except: From 1b886c5fd0301919d8257e8ae6c5152740e7c15c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sun, 1 Mar 2026 16:29:36 +0100 Subject: [PATCH 5/6] Update Doc/library/concurrent.futures.rst --- Doc/library/concurrent.futures.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index d774155e8efb33..cacfa8c80a903b 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -41,7 +41,6 @@ Executor Objects future = executor.submit(pow, 323, 1235) print(future.result()) - .. method:: map(fn, *iterables, timeout=None, chunksize=1, buffersize=None) Similar to :func:`map(fn, *iterables) ` except: From d9d2c8314ddfb113a6ff7581fd1803b8cd9e544f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sun, 1 Mar 2026 16:33:18 +0100 Subject: [PATCH 6/6] Update concurrent.futures.rst --- Doc/library/concurrent.futures.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index cacfa8c80a903b..5533ada563ebf8 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -151,10 +151,10 @@ And:: print(f.result()) executor = ThreadPoolExecutor(max_workers=1) - executor.submit(wait_on_future) - # Note: calling future.result() here would cause a deadlock because the single - # worker thread is already executing wait_on_future(), which itself is waiting - # for a result from the same executor. + future = executor.submit(wait_on_future) + # Note: calling future.result() would also cause a deadlock because + # the single worker thread is already waiting for wait_on_future(). + .. class:: ThreadPoolExecutor(max_workers=None, thread_name_prefix='', initializer=None, initargs=())