[Python-checkins] [3.12] gh-102024: Reduced _idle_semaphore.release calls (GH-102025) (#104959)

gpshead webhook-mailer at python.org
Fri May 26 02:21:24 EDT 2023


https://github.com/python/cpython/commit/8010cefc45d6763fea0c5950db9237ce42776516
commit: 8010cefc45d6763fea0c5950db9237ce42776516
branch: 3.12
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: gpshead <greg at krypto.org>
date: 2023-05-26T06:21:15Z
summary:

[3.12] gh-102024: Reduced _idle_semaphore.release calls (GH-102025) (#104959)

gh-102024: Reduced _idle_semaphore.release calls (GH-102025)

Reduced _idle_semaphore.release calls in concurrent.futures.thread._worker
_idle_semaphore.release() is now only called if only work_queue is empty.

---------

(cherry picked from commit 0242e9a57aa87ed0b5cac526f65631c654a39054)

Co-authored-by: Andrii Kuzmin <jack.cvr at gmail.com>
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
Co-authored-by: Shantanu <12621235+hauntsaninja at users.noreply.github.com>

files:
A Misc/NEWS.d/next/Library/2023-02-18-22-55-48.gh-issue-102024.RUmg_D.rst
M Lib/concurrent/futures/thread.py

diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py
index 51c942f51abd3..3b3a36a509333 100644
--- a/Lib/concurrent/futures/thread.py
+++ b/Lib/concurrent/futures/thread.py
@@ -43,7 +43,7 @@ def _python_exit():
                         after_in_parent=_global_shutdown_lock.release)
 
 
-class _WorkItem(object):
+class _WorkItem:
     def __init__(self, future, fn, args, kwargs):
         self.future = future
         self.fn = fn
@@ -78,17 +78,20 @@ def _worker(executor_reference, work_queue, initializer, initargs):
             return
     try:
         while True:
-            work_item = work_queue.get(block=True)
-            if work_item is not None:
-                work_item.run()
-                # Delete references to object. See issue16284
-                del work_item
-
-                # attempt to increment idle count
+            try:
+                work_item = work_queue.get_nowait()
+            except queue.Empty:
+                # attempt to increment idle count if queue is empty
                 executor = executor_reference()
                 if executor is not None:
                     executor._idle_semaphore.release()
                 del executor
+                work_item = work_queue.get(block=True)
+
+            if work_item is not None:
+                work_item.run()
+                # Delete references to object. See GH-60488
+                del work_item
                 continue
 
             executor = executor_reference()
diff --git a/Misc/NEWS.d/next/Library/2023-02-18-22-55-48.gh-issue-102024.RUmg_D.rst b/Misc/NEWS.d/next/Library/2023-02-18-22-55-48.gh-issue-102024.RUmg_D.rst
new file mode 100644
index 0000000000000..bb9e28e06c555
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-02-18-22-55-48.gh-issue-102024.RUmg_D.rst
@@ -0,0 +1 @@
+Reduce calls of ``_idle_semaphore.release()`` in :func:`concurrent.futures.thread._worker`.



More information about the Python-checkins mailing list