[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 0242e9a57a)

Co-authored-by: Andrii Kuzmin <jack.cvr@gmail.com>
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
Co-authored-by: Shantanu <12621235+hauntsaninja@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot) 2023-05-25 23:21:15 -07:00 committed by GitHub
parent 5c2971b78f
commit 8010cefc45
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 8 deletions

View file

@ -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()

View file

@ -0,0 +1 @@
Reduce calls of ``_idle_semaphore.release()`` in :func:`concurrent.futures.thread._worker`.