summaryrefslogtreecommitdiffstats
path: root/Lib/multiprocessing
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
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')
-rw-r--r--Lib/multiprocessing/managers.py4
-rw-r--r--Lib/multiprocessing/synchronize.py24
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: