Antoine Pitrou | 64a467d | 2010-12-12 20:34:49 +0000 | [diff] [blame] | 1 | :mod:`concurrent.futures` --- Launching parallel tasks |
| 2 | ====================================================== |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 3 | |
| 4 | .. module:: concurrent.futures |
| 5 | :synopsis: Execute computations concurrently using threads or processes. |
| 6 | |
Éric Araujo | 19f9b71 | 2011-08-19 00:49:18 +0200 | [diff] [blame] | 7 | .. versionadded:: 3.2 |
| 8 | |
Raymond Hettinger | a199368 | 2011-01-27 01:20:32 +0000 | [diff] [blame] | 9 | **Source code:** :source:`Lib/concurrent/futures/thread.py` |
| 10 | and :source:`Lib/concurrent/futures/process.py` |
| 11 | |
Raymond Hettinger | a199368 | 2011-01-27 01:20:32 +0000 | [diff] [blame] | 12 | -------------- |
| 13 | |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 14 | The :mod:`concurrent.futures` module provides a high-level interface for |
| 15 | asynchronously executing callables. |
| 16 | |
Ezio Melotti | e130a52 | 2011-10-19 10:58:56 +0300 | [diff] [blame] | 17 | The asynchronous execution can be performed with threads, using |
Georg Brandl | fb1720b | 2010-12-09 18:08:43 +0000 | [diff] [blame] | 18 | :class:`ThreadPoolExecutor`, or separate processes, using |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 19 | :class:`ProcessPoolExecutor`. Both implement the same interface, which is |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 20 | defined by the abstract :class:`Executor` class. |
| 21 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 22 | |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 23 | Executor Objects |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 24 | ---------------- |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 25 | |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 26 | .. class:: Executor |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 27 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 28 | An abstract class that provides methods to execute calls asynchronously. It |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 29 | should not be used directly, but through its concrete subclasses. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 30 | |
Serhiy Storchaka | 142566c | 2019-06-05 18:22:31 +0300 | [diff] [blame] | 31 | .. method:: submit(fn, /, *args, **kwargs) |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 32 | |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 33 | Schedules the callable, *fn*, to be executed as ``fn(*args **kwargs)`` |
| 34 | and returns a :class:`Future` object representing the execution of the |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 35 | callable. :: |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 36 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 37 | with ThreadPoolExecutor(max_workers=1) as executor: |
| 38 | future = executor.submit(pow, 323, 1235) |
| 39 | print(future.result()) |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 40 | |
Antoine Pitrou | 4aae276 | 2014-10-04 20:20:10 +0200 | [diff] [blame] | 41 | .. method:: map(func, *iterables, timeout=None, chunksize=1) |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 42 | |
Antoine Pitrou | a7a751d | 2017-12-20 19:06:20 +0100 | [diff] [blame] | 43 | Similar to :func:`map(func, *iterables) <map>` except: |
| 44 | |
| 45 | * the *iterables* are collected immediately rather than lazily; |
| 46 | |
| 47 | * *func* is executed asynchronously and several calls to |
| 48 | *func* may be made concurrently. |
| 49 | |
| 50 | The returned iterator raises a :exc:`concurrent.futures.TimeoutError` |
| 51 | if :meth:`~iterator.__next__` is called and the result isn't available |
Ezio Melotti | 7fa8222 | 2012-10-12 13:42:08 +0300 | [diff] [blame] | 52 | after *timeout* seconds from the original call to :meth:`Executor.map`. |
| 53 | *timeout* can be an int or a float. If *timeout* is not specified or |
Antoine Pitrou | a7a751d | 2017-12-20 19:06:20 +0100 | [diff] [blame] | 54 | ``None``, there is no limit to the wait time. |
| 55 | |
| 56 | If a *func* call raises an exception, then that exception will be |
| 57 | raised when its value is retrieved from the iterator. |
| 58 | |
| 59 | When using :class:`ProcessPoolExecutor`, this method chops *iterables* |
| 60 | into a number of chunks which it submits to the pool as separate |
| 61 | tasks. The (approximate) size of these chunks can be specified by |
| 62 | setting *chunksize* to a positive integer. For very long iterables, |
| 63 | using a large value for *chunksize* can significantly improve |
| 64 | performance compared to the default size of 1. With |
| 65 | :class:`ThreadPoolExecutor`, *chunksize* has no effect. |
Antoine Pitrou | 4aae276 | 2014-10-04 20:20:10 +0200 | [diff] [blame] | 66 | |
| 67 | .. versionchanged:: 3.5 |
| 68 | Added the *chunksize* argument. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 69 | |
Kyle Stanley | 339fd46 | 2020-02-02 07:49:00 -0500 | [diff] [blame] | 70 | .. method:: shutdown(wait=True, \*, cancel_futures=False) |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 71 | |
| 72 | Signal the executor that it should free any resources that it is using |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 73 | when the currently pending futures are done executing. Calls to |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 74 | :meth:`Executor.submit` and :meth:`Executor.map` made after shutdown will |
| 75 | raise :exc:`RuntimeError`. |
| 76 | |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 77 | If *wait* is ``True`` then this method will not return until all the |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 78 | pending futures are done executing and the resources associated with the |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 79 | executor have been freed. If *wait* is ``False`` then this method will |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 80 | return immediately and the resources associated with the executor will be |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 81 | freed when all pending futures are done executing. Regardless of the |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 82 | value of *wait*, the entire Python program will not exit until all |
| 83 | pending futures are done executing. |
| 84 | |
Kyle Stanley | 339fd46 | 2020-02-02 07:49:00 -0500 | [diff] [blame] | 85 | If *cancel_futures* is ``True``, this method will cancel all pending |
| 86 | futures that the executor has not started running. Any futures that |
| 87 | are completed or running won't be cancelled, regardless of the value |
| 88 | of *cancel_futures*. |
| 89 | |
| 90 | If both *cancel_futures* and *wait* are ``True``, all futures that the |
| 91 | executor has started running will be completed prior to this method |
| 92 | returning. The remaining futures are cancelled. |
| 93 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 94 | You can avoid having to call this method explicitly if you use the |
| 95 | :keyword:`with` statement, which will shutdown the :class:`Executor` |
| 96 | (waiting as if :meth:`Executor.shutdown` were called with *wait* set to |
| 97 | ``True``):: |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 98 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 99 | import shutil |
| 100 | with ThreadPoolExecutor(max_workers=4) as e: |
| 101 | e.submit(shutil.copy, 'src1.txt', 'dest1.txt') |
| 102 | e.submit(shutil.copy, 'src2.txt', 'dest2.txt') |
| 103 | e.submit(shutil.copy, 'src3.txt', 'dest3.txt') |
Berker Peksag | 0b0c3b6 | 2015-09-15 19:59:03 +0300 | [diff] [blame] | 104 | e.submit(shutil.copy, 'src4.txt', 'dest4.txt') |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 105 | |
Kyle Stanley | 339fd46 | 2020-02-02 07:49:00 -0500 | [diff] [blame] | 106 | .. versionchanged:: 3.9 |
| 107 | Added *cancel_futures*. |
| 108 | |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 109 | |
| 110 | ThreadPoolExecutor |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 111 | ------------------ |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 112 | |
Martin Panter | 7462b649 | 2015-11-02 03:37:02 +0000 | [diff] [blame] | 113 | :class:`ThreadPoolExecutor` is an :class:`Executor` subclass that uses a pool of |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 114 | threads to execute calls asynchronously. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 115 | |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 116 | Deadlocks can occur when the callable associated with a :class:`Future` waits on |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 117 | the results of another :class:`Future`. For example:: |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 118 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 119 | import time |
| 120 | def wait_on_b(): |
| 121 | time.sleep(5) |
Serhiy Storchaka | dba9039 | 2016-05-10 12:01:23 +0300 | [diff] [blame] | 122 | print(b.result()) # b will never complete because it is waiting on a. |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 123 | return 5 |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 124 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 125 | def wait_on_a(): |
| 126 | time.sleep(5) |
Serhiy Storchaka | dba9039 | 2016-05-10 12:01:23 +0300 | [diff] [blame] | 127 | print(a.result()) # a will never complete because it is waiting on b. |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 128 | return 6 |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 129 | |
| 130 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 131 | executor = ThreadPoolExecutor(max_workers=2) |
| 132 | a = executor.submit(wait_on_b) |
| 133 | b = executor.submit(wait_on_a) |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 134 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 135 | And:: |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 136 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 137 | def wait_on_future(): |
| 138 | f = executor.submit(pow, 5, 2) |
| 139 | # This will never complete because there is only one worker thread and |
| 140 | # it is executing this function. |
| 141 | print(f.result()) |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 142 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 143 | executor = ThreadPoolExecutor(max_workers=1) |
| 144 | executor.submit(wait_on_future) |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 145 | |
| 146 | |
Antoine Pitrou | 63ff413 | 2017-11-04 11:05:49 +0100 | [diff] [blame] | 147 | .. class:: ThreadPoolExecutor(max_workers=None, thread_name_prefix='', initializer=None, initargs=()) |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 148 | |
| 149 | An :class:`Executor` subclass that uses a pool of at most *max_workers* |
| 150 | threads to execute calls asynchronously. |
| 151 | |
Antoine Pitrou | 63ff413 | 2017-11-04 11:05:49 +0100 | [diff] [blame] | 152 | *initializer* is an optional callable that is called at the start of |
| 153 | each worker thread; *initargs* is a tuple of arguments passed to the |
| 154 | initializer. Should *initializer* raise an exception, all currently |
| 155 | pending jobs will raise a :exc:`~concurrent.futures.thread.BrokenThreadPool`, |
Matt Wheeler | 40a61da | 2018-12-05 21:41:20 +0000 | [diff] [blame] | 156 | as well as any attempt to submit more jobs to the pool. |
Antoine Pitrou | 63ff413 | 2017-11-04 11:05:49 +0100 | [diff] [blame] | 157 | |
Guido van Rossum | cfd4661 | 2014-09-02 10:39:18 -0700 | [diff] [blame] | 158 | .. versionchanged:: 3.5 |
| 159 | If *max_workers* is ``None`` or |
| 160 | not given, it will default to the number of processors on the machine, |
| 161 | multiplied by ``5``, assuming that :class:`ThreadPoolExecutor` is often |
| 162 | used to overlap I/O instead of CPU work and the number of workers |
| 163 | should be higher than the number of workers |
| 164 | for :class:`ProcessPoolExecutor`. |
| 165 | |
Gregory P. Smith | 50abe87 | 2016-08-07 10:19:20 -0700 | [diff] [blame] | 166 | .. versionadded:: 3.6 |
| 167 | The *thread_name_prefix* argument was added to allow users to |
Matt Wheeler | 40a61da | 2018-12-05 21:41:20 +0000 | [diff] [blame] | 168 | control the :class:`threading.Thread` names for worker threads created by |
Gregory P. Smith | 50abe87 | 2016-08-07 10:19:20 -0700 | [diff] [blame] | 169 | the pool for easier debugging. |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 170 | |
Antoine Pitrou | 63ff413 | 2017-11-04 11:05:49 +0100 | [diff] [blame] | 171 | .. versionchanged:: 3.7 |
| 172 | Added the *initializer* and *initargs* arguments. |
| 173 | |
Inada Naoki | 9a7e5b1 | 2019-05-28 21:02:52 +0900 | [diff] [blame] | 174 | .. versionchanged:: 3.8 |
| 175 | Default value of *max_workers* is changed to ``min(32, os.cpu_count() + 4)``. |
| 176 | This default value preserves at least 5 workers for I/O bound tasks. |
| 177 | It utilizes at most 32 CPU cores for CPU bound tasks which release the GIL. |
| 178 | And it avoids using very large resources implicitly on many-core machines. |
| 179 | |
| 180 | ThreadPoolExecutor now reuses idle worker threads before starting |
| 181 | *max_workers* worker threads too. |
| 182 | |
Antoine Pitrou | 63ff413 | 2017-11-04 11:05:49 +0100 | [diff] [blame] | 183 | |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 184 | .. _threadpoolexecutor-example: |
| 185 | |
| 186 | ThreadPoolExecutor Example |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 187 | ~~~~~~~~~~~~~~~~~~~~~~~~~~ |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 188 | :: |
| 189 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 190 | import concurrent.futures |
| 191 | import urllib.request |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 192 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 193 | URLS = ['http://www.foxnews.com/', |
| 194 | 'http://www.cnn.com/', |
| 195 | 'http://europe.wsj.com/', |
| 196 | 'http://www.bbc.co.uk/', |
| 197 | 'http://some-made-up-domain.com/'] |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 198 | |
Martin Panter | fe289c0 | 2016-05-28 02:20:39 +0000 | [diff] [blame] | 199 | # Retrieve a single page and report the URL and contents |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 200 | def load_url(url, timeout): |
Berker Peksag | 9575e18 | 2015-04-12 13:52:49 +0300 | [diff] [blame] | 201 | with urllib.request.urlopen(url, timeout=timeout) as conn: |
| 202 | return conn.read() |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 203 | |
Nick Coghlan | f06ea25 | 2012-10-16 22:50:04 +1000 | [diff] [blame] | 204 | # We can use a with statement to ensure threads are cleaned up promptly |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 205 | with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: |
Nick Coghlan | f06ea25 | 2012-10-16 22:50:04 +1000 | [diff] [blame] | 206 | # Start the load operations and mark each future with its URL |
Georg Brandl | 0a1bc11 | 2013-03-23 15:59:46 +0100 | [diff] [blame] | 207 | future_to_url = {executor.submit(load_url, url, 60): url for url in URLS} |
Nick Coghlan | d6d5cf3 | 2012-10-16 23:14:03 +1000 | [diff] [blame] | 208 | for future in concurrent.futures.as_completed(future_to_url): |
Nick Coghlan | 40c6773 | 2012-10-20 20:13:21 +1000 | [diff] [blame] | 209 | url = future_to_url[future] |
Nick Coghlan | f06ea25 | 2012-10-16 22:50:04 +1000 | [diff] [blame] | 210 | try: |
| 211 | data = future.result() |
| 212 | except Exception as exc: |
| 213 | print('%r generated an exception: %s' % (url, exc)) |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 214 | else: |
Nick Coghlan | f06ea25 | 2012-10-16 22:50:04 +1000 | [diff] [blame] | 215 | print('%r page is %d bytes' % (url, len(data))) |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 216 | |
| 217 | |
| 218 | ProcessPoolExecutor |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 219 | ------------------- |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 220 | |
| 221 | The :class:`ProcessPoolExecutor` class is an :class:`Executor` subclass that |
| 222 | uses a pool of processes to execute calls asynchronously. |
| 223 | :class:`ProcessPoolExecutor` uses the :mod:`multiprocessing` module, which |
| 224 | allows it to side-step the :term:`Global Interpreter Lock` but also means that |
| 225 | only picklable objects can be executed and returned. |
| 226 | |
bquinlan | 7749cb5 | 2013-10-26 04:49:55 +1100 | [diff] [blame] | 227 | The ``__main__`` module must be importable by worker subprocesses. This means |
| 228 | that :class:`ProcessPoolExecutor` will not work in the interactive interpreter. |
| 229 | |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 230 | Calling :class:`Executor` or :class:`Future` methods from a callable submitted |
| 231 | to a :class:`ProcessPoolExecutor` will result in deadlock. |
| 232 | |
Antoine Pitrou | 63ff413 | 2017-11-04 11:05:49 +0100 | [diff] [blame] | 233 | .. class:: ProcessPoolExecutor(max_workers=None, mp_context=None, initializer=None, initargs=()) |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 234 | |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 235 | An :class:`Executor` subclass that executes calls asynchronously using a pool |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 236 | of at most *max_workers* processes. If *max_workers* is ``None`` or not |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 237 | given, it will default to the number of processors on the machine. |
Brian Quinlan | 20efceb | 2014-05-17 13:51:10 -0700 | [diff] [blame] | 238 | If *max_workers* is lower or equal to ``0``, then a :exc:`ValueError` |
| 239 | will be raised. |
Brian Quinlan | 3988986 | 2019-05-08 14:04:53 -0400 | [diff] [blame] | 240 | On Windows, *max_workers* must be equal or lower than ``61``. If it is not |
| 241 | then :exc:`ValueError` will be raised. If *max_workers* is ``None``, then |
| 242 | the default chosen will be at most ``61``, even if more processors are |
| 243 | available. |
Thomas Moreau | e8c368d | 2017-10-03 11:53:17 +0200 | [diff] [blame] | 244 | *mp_context* can be a multiprocessing context or None. It will be used to |
| 245 | launch the workers. If *mp_context* is ``None`` or not given, the default |
| 246 | multiprocessing context is used. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 247 | |
Antoine Pitrou | 63ff413 | 2017-11-04 11:05:49 +0100 | [diff] [blame] | 248 | *initializer* is an optional callable that is called at the start of |
| 249 | each worker process; *initargs* is a tuple of arguments passed to the |
| 250 | initializer. Should *initializer* raise an exception, all currently |
Joni Kähärä | b60b468 | 2018-09-25 06:30:25 +0300 | [diff] [blame] | 251 | pending jobs will raise a :exc:`~concurrent.futures.process.BrokenProcessPool`, |
Antoine Pitrou | 63ff413 | 2017-11-04 11:05:49 +0100 | [diff] [blame] | 252 | as well any attempt to submit more jobs to the pool. |
| 253 | |
Antoine Pitrou | dd69649 | 2011-06-08 17:21:55 +0200 | [diff] [blame] | 254 | .. versionchanged:: 3.3 |
| 255 | When one of the worker processes terminates abruptly, a |
| 256 | :exc:`BrokenProcessPool` error is now raised. Previously, behaviour |
| 257 | was undefined but operations on the executor or its futures would often |
| 258 | freeze or deadlock. |
| 259 | |
Thomas Moreau | e8c368d | 2017-10-03 11:53:17 +0200 | [diff] [blame] | 260 | .. versionchanged:: 3.7 |
| 261 | The *mp_context* argument was added to allow users to control the |
| 262 | start_method for worker processes created by the pool. |
| 263 | |
Antoine Pitrou | 63ff413 | 2017-11-04 11:05:49 +0100 | [diff] [blame] | 264 | Added the *initializer* and *initargs* arguments. |
| 265 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 266 | |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 267 | .. _processpoolexecutor-example: |
| 268 | |
| 269 | ProcessPoolExecutor Example |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 270 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 271 | :: |
| 272 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 273 | import concurrent.futures |
| 274 | import math |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 275 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 276 | PRIMES = [ |
| 277 | 112272535095293, |
| 278 | 112582705942171, |
| 279 | 112272535095293, |
| 280 | 115280095190773, |
| 281 | 115797848077099, |
| 282 | 1099726899285419] |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 283 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 284 | def is_prime(n): |
Julien Palard | 8e73ad3 | 2018-10-17 08:45:51 +0200 | [diff] [blame] | 285 | if n < 2: |
| 286 | return False |
| 287 | if n == 2: |
| 288 | return True |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 289 | if n % 2 == 0: |
| 290 | return False |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 291 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 292 | sqrt_n = int(math.floor(math.sqrt(n))) |
| 293 | for i in range(3, sqrt_n + 1, 2): |
| 294 | if n % i == 0: |
| 295 | return False |
| 296 | return True |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 297 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 298 | def main(): |
| 299 | with concurrent.futures.ProcessPoolExecutor() as executor: |
| 300 | for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)): |
| 301 | print('%d is prime: %s' % (number, prime)) |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 302 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 303 | if __name__ == '__main__': |
| 304 | main() |
| 305 | |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 306 | |
| 307 | Future Objects |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 308 | -------------- |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 309 | |
Georg Brandl | 6faee4e | 2010-09-21 14:48:28 +0000 | [diff] [blame] | 310 | The :class:`Future` class encapsulates the asynchronous execution of a callable. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 311 | :class:`Future` instances are created by :meth:`Executor.submit`. |
| 312 | |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 313 | .. class:: Future |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 314 | |
Georg Brandl | 6faee4e | 2010-09-21 14:48:28 +0000 | [diff] [blame] | 315 | Encapsulates the asynchronous execution of a callable. :class:`Future` |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 316 | instances are created by :meth:`Executor.submit` and should not be created |
| 317 | directly except for testing. |
| 318 | |
| 319 | .. method:: cancel() |
| 320 | |
Géry Ogam | 431478d | 2019-06-14 16:39:43 +0200 | [diff] [blame] | 321 | Attempt to cancel the call. If the call is currently being executed or |
| 322 | finished running and cannot be cancelled then the method will return |
| 323 | ``False``, otherwise the call will be cancelled and the method will |
| 324 | return ``True``. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 325 | |
| 326 | .. method:: cancelled() |
| 327 | |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 328 | Return ``True`` if the call was successfully cancelled. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 329 | |
| 330 | .. method:: running() |
| 331 | |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 332 | Return ``True`` if the call is currently being executed and cannot be |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 333 | cancelled. |
| 334 | |
| 335 | .. method:: done() |
| 336 | |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 337 | Return ``True`` if the call was successfully cancelled or finished |
| 338 | running. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 339 | |
| 340 | .. method:: result(timeout=None) |
| 341 | |
| 342 | Return the value returned by the call. If the call hasn't yet completed |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 343 | then this method will wait up to *timeout* seconds. If the call hasn't |
Senthil Kumaran | 9e9f850 | 2016-01-18 18:45:00 -0800 | [diff] [blame] | 344 | completed in *timeout* seconds, then a |
| 345 | :exc:`concurrent.futures.TimeoutError` will be raised. *timeout* can be |
| 346 | an int or float. If *timeout* is not specified or ``None``, there is no |
| 347 | limit to the wait time. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 348 | |
Senthil Kumaran | 9e9f850 | 2016-01-18 18:45:00 -0800 | [diff] [blame] | 349 | If the future is cancelled before completing then :exc:`.CancelledError` |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 350 | will be raised. |
| 351 | |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 352 | If the call raised, this method will raise the same exception. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 353 | |
| 354 | .. method:: exception(timeout=None) |
| 355 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 356 | Return the exception raised by the call. If the call hasn't yet |
| 357 | completed then this method will wait up to *timeout* seconds. If the |
Senthil Kumaran | 9e9f850 | 2016-01-18 18:45:00 -0800 | [diff] [blame] | 358 | call hasn't completed in *timeout* seconds, then a |
| 359 | :exc:`concurrent.futures.TimeoutError` will be raised. *timeout* can be |
| 360 | an int or float. If *timeout* is not specified or ``None``, there is no |
| 361 | limit to the wait time. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 362 | |
Senthil Kumaran | 9e9f850 | 2016-01-18 18:45:00 -0800 | [diff] [blame] | 363 | If the future is cancelled before completing then :exc:`.CancelledError` |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 364 | will be raised. |
| 365 | |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 366 | If the call completed without raising, ``None`` is returned. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 367 | |
| 368 | .. method:: add_done_callback(fn) |
| 369 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 370 | Attaches the callable *fn* to the future. *fn* will be called, with the |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 371 | future as its only argument, when the future is cancelled or finishes |
| 372 | running. |
| 373 | |
| 374 | Added callables are called in the order that they were added and are |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 375 | always called in a thread belonging to the process that added them. If |
Martin Panter | 7462b649 | 2015-11-02 03:37:02 +0000 | [diff] [blame] | 376 | the callable raises an :exc:`Exception` subclass, it will be logged and |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 377 | ignored. If the callable raises a :exc:`BaseException` subclass, the |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 378 | behavior is undefined. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 379 | |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 380 | If the future has already completed or been cancelled, *fn* will be |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 381 | called immediately. |
| 382 | |
| 383 | The following :class:`Future` methods are meant for use in unit tests and |
| 384 | :class:`Executor` implementations. |
| 385 | |
| 386 | .. method:: set_running_or_notify_cancel() |
| 387 | |
| 388 | This method should only be called by :class:`Executor` implementations |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 389 | before executing the work associated with the :class:`Future` and by unit |
| 390 | tests. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 391 | |
Senthil Kumaran | 916bd38 | 2010-10-15 12:55:19 +0000 | [diff] [blame] | 392 | If the method returns ``False`` then the :class:`Future` was cancelled, |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 393 | i.e. :meth:`Future.cancel` was called and returned `True`. Any threads |
| 394 | waiting on the :class:`Future` completing (i.e. through |
| 395 | :func:`as_completed` or :func:`wait`) will be woken up. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 396 | |
Senthil Kumaran | 916bd38 | 2010-10-15 12:55:19 +0000 | [diff] [blame] | 397 | If the method returns ``True`` then the :class:`Future` was not cancelled |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 398 | and has been put in the running state, i.e. calls to |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 399 | :meth:`Future.running` will return `True`. |
| 400 | |
| 401 | This method can only be called once and cannot be called after |
| 402 | :meth:`Future.set_result` or :meth:`Future.set_exception` have been |
| 403 | called. |
| 404 | |
| 405 | .. method:: set_result(result) |
| 406 | |
| 407 | Sets the result of the work associated with the :class:`Future` to |
| 408 | *result*. |
| 409 | |
| 410 | This method should only be used by :class:`Executor` implementations and |
| 411 | unit tests. |
| 412 | |
jhaydaman | 0a28c0d | 2018-05-30 02:15:06 -0500 | [diff] [blame] | 413 | .. versionchanged:: 3.8 |
| 414 | This method raises |
| 415 | :exc:`concurrent.futures.InvalidStateError` if the :class:`Future` is |
| 416 | already done. |
| 417 | |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 418 | .. method:: set_exception(exception) |
| 419 | |
| 420 | Sets the result of the work associated with the :class:`Future` to the |
| 421 | :class:`Exception` *exception*. |
| 422 | |
| 423 | This method should only be used by :class:`Executor` implementations and |
| 424 | unit tests. |
| 425 | |
jhaydaman | 0a28c0d | 2018-05-30 02:15:06 -0500 | [diff] [blame] | 426 | .. versionchanged:: 3.8 |
| 427 | This method raises |
| 428 | :exc:`concurrent.futures.InvalidStateError` if the :class:`Future` is |
| 429 | already done. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 430 | |
| 431 | Module Functions |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 432 | ---------------- |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 433 | |
| 434 | .. function:: wait(fs, timeout=None, return_when=ALL_COMPLETED) |
| 435 | |
| 436 | Wait for the :class:`Future` instances (possibly created by different |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 437 | :class:`Executor` instances) given by *fs* to complete. Returns a named |
| 438 | 2-tuple of sets. The first set, named ``done``, contains the futures that |
Géry Ogam | 431478d | 2019-06-14 16:39:43 +0200 | [diff] [blame] | 439 | completed (finished or cancelled futures) before the wait completed. The |
| 440 | second set, named ``not_done``, contains the futures that did not complete |
| 441 | (pending or running futures). |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 442 | |
| 443 | *timeout* can be used to control the maximum number of seconds to wait before |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 444 | returning. *timeout* can be an int or float. If *timeout* is not specified |
| 445 | or ``None``, there is no limit to the wait time. |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 446 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 447 | *return_when* indicates when this function should return. It must be one of |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 448 | the following constants: |
| 449 | |
Georg Brandl | 44ea77b | 2013-03-28 13:28:44 +0100 | [diff] [blame] | 450 | .. tabularcolumns:: |l|L| |
| 451 | |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 452 | +-----------------------------+----------------------------------------+ |
| 453 | | Constant | Description | |
| 454 | +=============================+========================================+ |
| 455 | | :const:`FIRST_COMPLETED` | The function will return when any | |
| 456 | | | future finishes or is cancelled. | |
| 457 | +-----------------------------+----------------------------------------+ |
| 458 | | :const:`FIRST_EXCEPTION` | The function will return when any | |
| 459 | | | future finishes by raising an | |
| 460 | | | exception. If no future raises an | |
| 461 | | | exception then it is equivalent to | |
| 462 | | | :const:`ALL_COMPLETED`. | |
| 463 | +-----------------------------+----------------------------------------+ |
| 464 | | :const:`ALL_COMPLETED` | The function will return when all | |
| 465 | | | futures finish or are cancelled. | |
| 466 | +-----------------------------+----------------------------------------+ |
Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 467 | |
| 468 | .. function:: as_completed(fs, timeout=None) |
| 469 | |
Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 470 | Returns an iterator over the :class:`Future` instances (possibly created by |
| 471 | different :class:`Executor` instances) given by *fs* that yields futures as |
Géry Ogam | 431478d | 2019-06-14 16:39:43 +0200 | [diff] [blame] | 472 | they complete (finished or cancelled futures). Any futures given by *fs* that |
Senthil Kumaran | 9e9f850 | 2016-01-18 18:45:00 -0800 | [diff] [blame] | 473 | are duplicated will be returned once. Any futures that completed before |
| 474 | :func:`as_completed` is called will be yielded first. The returned iterator |
| 475 | raises a :exc:`concurrent.futures.TimeoutError` if :meth:`~iterator.__next__` |
| 476 | is called and the result isn't available after *timeout* seconds from the |
| 477 | original call to :func:`as_completed`. *timeout* can be an int or float. If |
| 478 | *timeout* is not specified or ``None``, there is no limit to the wait time. |
Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 479 | |
| 480 | |
| 481 | .. seealso:: |
| 482 | |
| 483 | :pep:`3148` -- futures - execute computations asynchronously |
| 484 | The proposal which described this feature for inclusion in the Python |
| 485 | standard library. |
Antoine Pitrou | dd69649 | 2011-06-08 17:21:55 +0200 | [diff] [blame] | 486 | |
| 487 | |
| 488 | Exception classes |
| 489 | ----------------- |
| 490 | |
Senthil Kumaran | 9e9f850 | 2016-01-18 18:45:00 -0800 | [diff] [blame] | 491 | .. currentmodule:: concurrent.futures |
| 492 | |
| 493 | .. exception:: CancelledError |
| 494 | |
| 495 | Raised when a future is cancelled. |
| 496 | |
| 497 | .. exception:: TimeoutError |
| 498 | |
| 499 | Raised when a future operation exceeds the given timeout. |
| 500 | |
Antoine Pitrou | 63ff413 | 2017-11-04 11:05:49 +0100 | [diff] [blame] | 501 | .. exception:: BrokenExecutor |
| 502 | |
| 503 | Derived from :exc:`RuntimeError`, this exception class is raised |
| 504 | when an executor is broken for some reason, and cannot be used |
| 505 | to submit or execute new tasks. |
| 506 | |
| 507 | .. versionadded:: 3.7 |
| 508 | |
jhaydaman | 0a28c0d | 2018-05-30 02:15:06 -0500 | [diff] [blame] | 509 | .. exception:: InvalidStateError |
| 510 | |
| 511 | Raised when an operation is performed on a future that is not allowed |
| 512 | in the current state. |
| 513 | |
| 514 | .. versionadded:: 3.8 |
| 515 | |
Antoine Pitrou | 63ff413 | 2017-11-04 11:05:49 +0100 | [diff] [blame] | 516 | .. currentmodule:: concurrent.futures.thread |
| 517 | |
| 518 | .. exception:: BrokenThreadPool |
| 519 | |
| 520 | Derived from :exc:`~concurrent.futures.BrokenExecutor`, this exception |
| 521 | class is raised when one of the workers of a :class:`ThreadPoolExecutor` |
| 522 | has failed initializing. |
| 523 | |
| 524 | .. versionadded:: 3.7 |
| 525 | |
Georg Brandl | ce64ced | 2014-10-28 22:58:24 +0100 | [diff] [blame] | 526 | .. currentmodule:: concurrent.futures.process |
| 527 | |
Antoine Pitrou | dd69649 | 2011-06-08 17:21:55 +0200 | [diff] [blame] | 528 | .. exception:: BrokenProcessPool |
| 529 | |
Antoine Pitrou | 63ff413 | 2017-11-04 11:05:49 +0100 | [diff] [blame] | 530 | Derived from :exc:`~concurrent.futures.BrokenExecutor` (formerly |
| 531 | :exc:`RuntimeError`), this exception class is raised when one of the |
| 532 | workers of a :class:`ProcessPoolExecutor` has terminated in a non-clean |
| 533 | fashion (for example, if it was killed from the outside). |
Antoine Pitrou | dd69649 | 2011-06-08 17:21:55 +0200 | [diff] [blame] | 534 | |
| 535 | .. versionadded:: 3.3 |