]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-34054: multiprocessing uses time.monotonic() (GH-8118)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 6 Jul 2018 12:14:33 +0000 (05:14 -0700)
committerGitHub <noreply@github.com>
Fri, 6 Jul 2018 12:14:33 +0000 (05:14 -0700)
The multiprocessing module now uses the monotonic clock
time.monotonic() instead of the system clock time.time() to implement
timeouts.
(cherry picked from commit c2368cbc83ca2bafeaea0e4760be4996046d0444)

Co-authored-by: Victor Stinner <vstinner@redhat.com>
Lib/multiprocessing/connection.py
Lib/multiprocessing/managers.py
Lib/multiprocessing/queues.py
Lib/multiprocessing/synchronize.py
Misc/NEWS.d/next/Library/2018-07-05-18-37-05.bpo-34054.nWRS6M.rst [new file with mode: 0644]

index d49e8f0d32b62a4a4e6149e54b844672d047cde9..d3797503a7551e6c35f4d6bfb2d219dcc05eae8b 100644 (file)
@@ -57,10 +57,10 @@ if sys.platform == 'win32':
 
 
 def _init_timeout(timeout=CONNECTION_TIMEOUT):
-    return time.time() + timeout
+    return time.monotonic() + timeout
 
 def _check_timeout(t):
-    return time.time() > t
+    return time.monotonic() > t
 
 #
 #
@@ -905,7 +905,7 @@ else:
                 selector.register(obj, selectors.EVENT_READ)
 
             if timeout is not None:
-                deadline = time.time() + timeout
+                deadline = time.monotonic() + timeout
 
             while True:
                 ready = selector.select(timeout)
@@ -913,7 +913,7 @@ else:
                     return [key.fileobj for (key, events) in ready]
                 else:
                     if timeout is not None:
-                        timeout = deadline - time.time()
+                        timeout = deadline - time.monotonic()
                         if timeout < 0:
                             return ready
 
index b9ce84b2d85ddc4d6a561b3ba36d91445a0a27f7..27f26fdf6fecff2ea70a9eb1a0da2693c70088eb 100644 (file)
@@ -18,8 +18,8 @@ import sys
 import threading
 import array
 import queue
+import time
 
-from time import time as _time
 from traceback import format_exc
 
 from . import connection
@@ -1006,13 +1006,13 @@ class ConditionProxy(AcquirerProxy):
         if result:
             return result
         if timeout is not None:
-            endtime = _time() + timeout
+            endtime = time.monotonic() + timeout
         else:
             endtime = None
             waittime = None
         while not result:
             if endtime is not None:
-                waittime = endtime - _time()
+                waittime = endtime - time.monotonic()
                 if waittime <= 0:
                     break
             self.wait(waittime)
index 513807cafecb6dd2e19ec347ef210e9a2c109367..1b3fddb2bfece7b05410232d45baa602f5c7d74b 100644 (file)
@@ -95,12 +95,12 @@ class Queue(object):
             self._sem.release()
         else:
             if block:
-                deadline = time.time() + timeout
+                deadline = time.monotonic() + timeout
             if not self._rlock.acquire(block, timeout):
                 raise Empty
             try:
                 if block:
-                    timeout = deadline - time.time()
+                    timeout = deadline - time.monotonic()
                     if not self._poll(timeout):
                         raise Empty
                 elif not self._poll():
index d4bdf0e8b1737f6342b0ff11e38d53faf87f0dbb..364adbe6087856e5ebb0f02c90f3c19a56c297aa 100644 (file)
@@ -15,8 +15,7 @@ import threading
 import sys
 import tempfile
 import _multiprocessing
-
-from time import time as _time
+import time
 
 from . import context
 from . import process
@@ -313,13 +312,13 @@ class Condition(object):
         if result:
             return result
         if timeout is not None:
-            endtime = _time() + timeout
+            endtime = time.monotonic() + timeout
         else:
             endtime = None
             waittime = None
         while not result:
             if endtime is not None:
-                waittime = endtime - _time()
+                waittime = endtime - time.monotonic()
                 if waittime <= 0:
                     break
             self.wait(waittime)
diff --git a/Misc/NEWS.d/next/Library/2018-07-05-18-37-05.bpo-34054.nWRS6M.rst b/Misc/NEWS.d/next/Library/2018-07-05-18-37-05.bpo-34054.nWRS6M.rst
new file mode 100644 (file)
index 0000000..9d4d1f2
--- /dev/null
@@ -0,0 +1,3 @@
+The multiprocessing module now uses the monotonic clock
+:func:`time.monotonic` instead of the system clock :func:`time.time` to
+implement timeout.