All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning from version 1.20.0 onwards.
- n/a
2.11.4 - 2023-02-01
- Fixed compatibility with python 3.12 (asyncio)
- Removed an unnecessary reference cycle, reducing memory usage in some cases (#344)
2.11.3 - 2022-12-14
- Fixed off-by-one error in
RetryExecutor
sleep time calculation
2.11.2 - 2022-12-05
- Removed unnecessary dependency on
monotonic
for python 3.3 and later
2.11.1 - 2022-06-06
- Fixed InvalidStateError log spam in some future cancellation scenarios.
2.11.0 - 2022-04-27
- Prometheus support can now be disabled by setting the environment variable
MORE_EXECUTORS_PROMETHEUS=0
. ThrottleExecutor
now supports a blocking mode which can be used to block on submit, reducing memory usage.
2.10.1 - 2022-03-23
- Fixed output of
f_zip
never resolving if an input future was cancelled.
2.10.0 - 2022-02-27
- Flattened the
more_executors
module namespace; all public API may now be imported directly frommore_executors
without specifying a submodule.
2.9.0 - 2022-02-21
f_zip
now usesnamedtuple
return types to improve debuggability of certain error scenarios.
2.8.2 - 2022-02-16
- Fix a bug where
f_proxy
may trigger aRecursionError
, if used with a future raising anAttributeError
.
2.8.1 - 2021-07-21
- Fix a bug specific to Python 2 where mixing
f_proxy
with other future composition functions such asf_map
could result in the proxy future being eagerly evaluated.
2.8.0 - 2021-07-14
- Type stubs are now included. These have been tested with mypy and pylance. Type information is not complete, but is sufficient for most typical scenarios for composing executors and futures. Requires Python 3.9 or later.
- Internal refactoring to improve usability of prometheus metrics.
- Improved consistency of shutdown behavior. Previously, the behavior on incorrect usage of executors such as submit-after-shutdown or multiple calls to shutdown was not strictly defined and could differ between executors. Every executor will now raise an exception on submit-after-shutdown and will tolerate multiple calls to shutdown.
2.7.0 - 2021-07-11
- Introduced support for prometheus instrumentation.
- All executors now accept a
name
argument. If given, the name is used in prometheus metrics and in the name of any threads created by an executor.
2.6.0 - 2021-06-19
- Support the
cancel_futures
argument introduced ontoExecutor.shutdown
in Python 3.9.
DEBUG
log events are now only generated if theMORE_EXECUTORS_DEBUG
environment variable is set to1
. This change was made due to the extreme verbosity of debug logs if executors are used heavily.
2.5.1 - 2020-06-01
- Fixed a potential hang on exit when executors are not explicitly shut down (#176)
2.5.0 - 2019-09-23
ThrottleExecutor
now accepts a callable forcount
, for dynamic throttling.
- Internal refactoring to simplify backtraces in certain cases (#169).
2.4.0 - 2019-09-15
RetryExecutor
now logs an error and terminates retries of a future if the configuredRetryPolicy
raises an exception. Previously, futures would hang indefinitely in the case of a broken policy.
2.3.1 - 2019-09-11
- Fixed some scaling/performance issues with functions dealing with collections
of futures (
f_or
,f_and
,f_sequence
,f_zip
). These functions now support up to 100,000 input futures. In earlier versions of the library, these would break with approximately ~1,000 inputs.
2.3.0 - 2019-09-07
- Introduced proxy futures via
f_proxy
more_executors.futures.*
can now be referenced after animport more_executors
; there is no need to explicitlyimport more_executors.futures
.
2.2.0 - 2019-08-31
- map/flat_map now accept an
error_fn
to transform the result of an unsuccessful future (#153). - Introduced
PollExecutor.notify
to wake up aPollExecutor
early (#152).
2.1.2 - 2019-06-26
- Fixed a race condition with RetryExecutor which could occasionally result in a future being retried after a request to cancel (#150)
2.1.1 - 2019-06-16
- Avoid spurious "cannot schedule new futures after interpreter shutdown" tracebacks (#144)
- Most functions in
more_executors.futures
will now immediately raise aTypeError
if invoked with a non-future value where a future is expected. (#146)
2.1.0 - 2019-06-05
- It is now possible to call
f_return
with no arguments. This produces a future with a return value ofNone
.
2.0.2 - 2019-05-03
- Fixed an import error from autotests on Python 3.8
2.0.1 - 2019-04-06
- Fixed deprecation warnings on Python 3.7
2.0.0 - 2019-03-17
- API break: cleaned up all module namespaces, with various duplicate or external names removed. Clients using only documented API are unaffected.
1.20.2 - 2019-02-23
- Minor packaging improvements; add project_urls for PyPI
1.20.1 - 2019-02-15
- Minor packaging improvements
1.20.0 - 2019-01-19
cancel()
now terminates retries from RetryExecutor (#51)
1.19.0 - 2019-01-16
- Fixed TimeoutExecutor thread leak when
shutdown()
is never called
- Introduced
more_executors.futures
module for composing futures
1.18.0 - 2019-01-15
- Fixed deadlock when awaiting a future whose executor was garbage collected (#114)
- Reduced log verbosity (#115)
1.17.1 - 2019-01-09
- Exception tracebacks are now propagated correctly on python2
via
exception_info
1.16.0 - 2019-01-06
- Minor usability improvements to retry API
- Introduced flat_bind (#97)
- API break: removed
new_default
methods in retry module
1.15.0 - 2019-01-03
- Fixed possible deadlock in CancelOnShutdownExecutor (#98)
- Fixed
Executors.bind
withfunctools.partial
(#96) - Fixed ThrottleExecutor thread leak when
shutdown()
is never called (#93)
1.14.0 - 2018-12-26
- Fixed thread leaks when
shutdown()
is never called (#87) - Refactors to avoid pylint errors from client code (#86)
- API break: removed
Executors.wrap
class method
1.13.0 - 2018-12-15
- Introduced Executors.bind
1.12.0 - 2018-12-09
- Introduced FlatMapExecutor
1.11.0 - 2018-04-28
- Fixed hangs on executor shutdown
1.10.0 - 2018-04-28
- Fixed a race condition leading to RetryExecutor hangs
- Improved RetryPolicy API
- Added
logger
argument to each executor
1.9.0 - 2018-04-15
- Introduced ThrottleExecutor
1.8.0 - 2018-04-07
- Fixed missing long_description in package
1.7.0 - 2018-04-07
- Introduced AsyncioExecutor
- Revised TimeoutExecutor concept to "cancel after timeout"
1.6.0 - 2018-03-22
- Avoid some uninterruptible sleeps on Python 2.x
- Introduce TimeoutExecutor
- Use monotonic clock in RetryExecutor
- Minor improvements to logging