mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-29293: multiprocessing.Condition.notify() lacks parameter n
(#2480)
* bpo-29293: multiprocessing.Condition.notify() lacks parameter `n` * Add NEWS blurb
This commit is contained in:
parent
d3ed2877a7
commit
48350412b7
4 changed files with 71 additions and 28 deletions
|
@ -999,8 +999,8 @@ class ConditionProxy(AcquirerProxy):
|
|||
_exposed_ = ('acquire', 'release', 'wait', 'notify', 'notify_all')
|
||||
def wait(self, timeout=None):
|
||||
return self._callmethod('wait', (timeout,))
|
||||
def notify(self):
|
||||
return self._callmethod('notify')
|
||||
def notify(self, n=1):
|
||||
return self._callmethod('notify', (n,))
|
||||
def notify_all(self):
|
||||
return self._callmethod('notify_all')
|
||||
def wait_for(self, predicate, timeout=None):
|
||||
|
|
|
@ -268,24 +268,7 @@ class Condition(object):
|
|||
for i in range(count):
|
||||
self._lock.acquire()
|
||||
|
||||
def notify(self):
|
||||
assert self._lock._semlock._is_mine(), 'lock is not owned'
|
||||
assert not self._wait_semaphore.acquire(False)
|
||||
|
||||
# to take account of timeouts since last notify() we subtract
|
||||
# woken_count from sleeping_count and rezero woken_count
|
||||
while self._woken_count.acquire(False):
|
||||
res = self._sleeping_count.acquire(False)
|
||||
assert res
|
||||
|
||||
if self._sleeping_count.acquire(False): # try grabbing a sleeper
|
||||
self._wait_semaphore.release() # wake up one sleeper
|
||||
self._woken_count.acquire() # wait for the sleeper to wake
|
||||
|
||||
# rezero _wait_semaphore in case a timeout just happened
|
||||
self._wait_semaphore.acquire(False)
|
||||
|
||||
def notify_all(self):
|
||||
def notify(self, n=1):
|
||||
assert self._lock._semlock._is_mine(), 'lock is not owned'
|
||||
assert not self._wait_semaphore.acquire(False)
|
||||
|
||||
|
@ -296,7 +279,7 @@ class Condition(object):
|
|||
assert res
|
||||
|
||||
sleepers = 0
|
||||
while self._sleeping_count.acquire(False):
|
||||
while sleepers < n and self._sleeping_count.acquire(False):
|
||||
self._wait_semaphore.release() # wake up one sleeper
|
||||
sleepers += 1
|
||||
|
||||
|
@ -308,6 +291,9 @@ class Condition(object):
|
|||
while self._wait_semaphore.acquire(False):
|
||||
pass
|
||||
|
||||
def notify_all(self):
|
||||
self.notify(n=sys.maxsize)
|
||||
|
||||
def wait_for(self, predicate, timeout=None):
|
||||
result = predicate()
|
||||
if result:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue