diff options
author | Antoine Pitrou <pitrou@free.fr> | 2017-07-04 06:59:22 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-04 06:59:22 (GMT) |
commit | 48350412b70c76fa51f488cfc736c80d59b5e8eb (patch) | |
tree | 7614e3921d80f314a1efbb367ffc575833c892c2 /Lib/multiprocessing | |
parent | d3ed2877a798d07df75422afe136b4727e500c99 (diff) | |
download | cpython-48350412b70c76fa51f488cfc736c80d59b5e8eb.zip cpython-48350412b70c76fa51f488cfc736c80d59b5e8eb.tar.gz cpython-48350412b70c76fa51f488cfc736c80d59b5e8eb.tar.bz2 |
bpo-29293: multiprocessing.Condition.notify() lacks parameter `n` (#2480)
* bpo-29293: multiprocessing.Condition.notify() lacks parameter `n`
* Add NEWS blurb
Diffstat (limited to 'Lib/multiprocessing')
-rw-r--r-- | Lib/multiprocessing/managers.py | 4 | ||||
-rw-r--r-- | Lib/multiprocessing/synchronize.py | 24 |
2 files changed, 7 insertions, 21 deletions
diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index 43dd02a..cae1c10 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -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): diff --git a/Lib/multiprocessing/synchronize.py b/Lib/multiprocessing/synchronize.py index d4bdf0e..0590ed6 100644 --- a/Lib/multiprocessing/synchronize.py +++ b/Lib/multiprocessing/synchronize.py @@ -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: |