Skip to content

Commit

Permalink
gh-102024: Reduced _idle_semaphore.release calls (#102025)
Browse files Browse the repository at this point in the history
Reduced _idle_semaphore.release calls in concurrent.futures.thread._worker
_idle_semaphore.release() is now only called if only work_queue is empty.

---------

Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
Co-authored-by: Shantanu <12621235+hauntsaninja@users.noreply.github.com>
  • Loading branch information
3 people authored May 26, 2023
1 parent 72c3d2e commit 0242e9a
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 8 deletions.
19 changes: 11 additions & 8 deletions Lib/concurrent/futures/thread.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Reduce calls of ``_idle_semaphore.release()`` in :func:`concurrent.futures.thread._worker`.

0 comments on commit 0242e9a

Please sign in to comment.