New submission from orlnub123 <[email protected]>:
The map and as_completed functions can randomly timeout earlier or later due to
NTP stepping the clock or something changing the time and/or date.
Here's some code to reproduce the issue for map:
import concurrent.futures
import time
with concurrent.futures.ThreadPoolExecutor() as executor:
list(executor.map(time.sleep, [29, 30], timeout=3000))
And similar code to reproduce it for as_completed:
import concurrent.futures
import time
with concurrent.futures.ThreadPoolExecutor() as executor:
future1 = executor.submit(time.sleep, 29)
future2 = executor.submit(time.sleep, 30)
list(concurrent.futures.as_completed([future1, future2], timeout=3000))
It doesn't error normally, as it shouldn't, but if you move your clock an hour
ahead within 30 seconds of running it you get this:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "C:\Python\Python37\lib\concurrent\futures\_base.py", line 588, in
result_iterator
yield fs.pop().result(end_time - time.time())
File "C:\Python\Python37\lib\concurrent\futures\_base.py", line 434, in result
raise TimeoutError()
concurrent.futures._base.TimeoutError
Or this if you used the as_completed example:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
File "C:\Python\Python37\lib\concurrent\futures\_base.py", line 238, in
as_completed
len(pending), total_futures))
concurrent.futures._base.TimeoutError: 1 (of 2) futures unfinished
The error stems from map and as_completed using time.time to calculate the
duration for the timeout. The problem with time.time is that it's adjustable
(i.e. it can skip around) which makes it unideal for comparing relative times.
A solution would be to replace the time.time calls with either time.monotonic
(preferable?) or time.perf_counter.
----------
components: Library (Lib)
messages: 326535
nosy: orlnub123
priority: normal
severity: normal
status: open
title: Executor.map and as_completed timeouts are able to deviate
type: behavior
versions: Python 3.6, Python 3.7, Python 3.8
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue34819>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com