diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py index 7a621a55f46..1f3ea504fff 100644 --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -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 # # @@ -914,7 +914,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) @@ -922,7 +922,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 diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py index 04df26bac66..3f263802bc7 100644 --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -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 @@ -1045,13 +1045,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) diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index 715a9b0e129..88f7d267bfd 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -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(): diff --git a/Lib/multiprocessing/synchronize.py b/Lib/multiprocessing/synchronize.py index 038f73f6b76..5137c49c1b6 100644 --- a/Lib/multiprocessing/synchronize.py +++ b/Lib/multiprocessing/synchronize.py @@ -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 @@ -302,13 +301,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 index 00000000000..9d4d1f24db4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-07-05-18-37-05.bpo-34054.nWRS6M.rst @@ -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.