summaryrefslogtreecommitdiffstats
path: root/Lib/multiprocessing/synchronize.py
diff options
context:
space:
mode:
authorAntoine Pitrou <pitrou@free.fr>2017-07-04 06:59:22 (GMT)
committerGitHub <noreply@github.com>2017-07-04 06:59:22 (GMT)
commit48350412b70c76fa51f488cfc736c80d59b5e8eb (patch)
tree7614e3921d80f314a1efbb367ffc575833c892c2 /Lib/multiprocessing/synchronize.py
parentd3ed2877a798d07df75422afe136b4727e500c99 (diff)
downloadcpython-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/synchronize.py')
-rw-r--r--Lib/multiprocessing/synchronize.py24
1 files changed, 5 insertions, 19 deletions
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: