| 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 |  | 
 | 31 |     .. method:: submit(fn, *args, **kwargs) | 
 | 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 |  | 
| Serhiy Storchaka | 9e0ae53 | 2013-08-24 00:23:38 +0300 | [diff] [blame] | 43 |        Equivalent to :func:`map(func, *iterables) <map>` except *func* is executed | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 44 |        asynchronously and several calls to *func* may be made concurrently.  The | 
| Ezio Melotti | 7fa8222 | 2012-10-12 13:42:08 +0300 | [diff] [blame] | 45 |        returned iterator raises a :exc:`TimeoutError` if | 
 | 46 |        :meth:`~iterator.__next__` is called and the result isn't available | 
 | 47 |        after *timeout* seconds from the original call to :meth:`Executor.map`. | 
 | 48 |        *timeout* can be an int or a float.  If *timeout* is not specified or | 
 | 49 |        ``None``, there is no limit to the wait time.  If a call raises an | 
 | 50 |        exception, then that exception will be raised when its value is | 
| Antoine Pitrou | 4aae276 | 2014-10-04 20:20:10 +0200 | [diff] [blame] | 51 |        retrieved from the iterator. When using :class:`ProcessPoolExecutor`, this | 
 | 52 |        method chops *iterables* into a number of chunks which it submits to the | 
 | 53 |        pool as separate tasks. The (approximate) size of these chunks can be | 
 | 54 |        specified by setting *chunksize* to a positive integer. For very long | 
 | 55 |        iterables, using a large value for *chunksize* can significantly improve | 
 | 56 |        performance compared to the default size of 1. With :class:`ThreadPoolExecutor`, | 
 | 57 |        *chunksize* has no effect. | 
 | 58 |  | 
 | 59 |        .. versionchanged:: 3.5 | 
 | 60 |           Added the *chunksize* argument. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 61 |  | 
 | 62 |     .. method:: shutdown(wait=True) | 
 | 63 |  | 
 | 64 |        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] | 65 |        when the currently pending futures are done executing.  Calls to | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 66 |        :meth:`Executor.submit` and :meth:`Executor.map` made after shutdown will | 
 | 67 |        raise :exc:`RuntimeError`. | 
 | 68 |  | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 69 |        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] | 70 |        pending futures are done executing and the resources associated with the | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 71 |        executor have been freed.  If *wait* is ``False`` then this method will | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 72 |        return immediately and the resources associated with the executor will be | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 73 |        freed when all pending futures are done executing.  Regardless of the | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 74 |        value of *wait*, the entire Python program will not exit until all | 
 | 75 |        pending futures are done executing. | 
 | 76 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 77 |        You can avoid having to call this method explicitly if you use the | 
 | 78 |        :keyword:`with` statement, which will shutdown the :class:`Executor` | 
 | 79 |        (waiting as if :meth:`Executor.shutdown` were called with *wait* set to | 
 | 80 |        ``True``):: | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 81 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 82 |           import shutil | 
 | 83 |           with ThreadPoolExecutor(max_workers=4) as e: | 
 | 84 |               e.submit(shutil.copy, 'src1.txt', 'dest1.txt') | 
 | 85 |               e.submit(shutil.copy, 'src2.txt', 'dest2.txt') | 
 | 86 |               e.submit(shutil.copy, 'src3.txt', 'dest3.txt') | 
| Berker Peksag | 0b0c3b6 | 2015-09-15 19:59:03 +0300 | [diff] [blame] | 87 |               e.submit(shutil.copy, 'src4.txt', 'dest4.txt') | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 88 |  | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 89 |  | 
 | 90 | ThreadPoolExecutor | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 91 | ------------------ | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 92 |  | 
| Martin Panter | 7462b649 | 2015-11-02 03:37:02 +0000 | [diff] [blame] | 93 | :class:`ThreadPoolExecutor` is an :class:`Executor` subclass that uses a pool of | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 94 | threads to execute calls asynchronously. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 95 |  | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 96 | 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] | 97 | the results of another :class:`Future`.  For example:: | 
| 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 time | 
 | 100 |    def wait_on_b(): | 
 | 101 |        time.sleep(5) | 
 | 102 |        print(b.result()) # b will never complete because it is waiting on a. | 
 | 103 |        return 5 | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 104 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 105 |    def wait_on_a(): | 
 | 106 |        time.sleep(5) | 
 | 107 |        print(a.result()) # a will never complete because it is waiting on b. | 
 | 108 |        return 6 | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 109 |  | 
 | 110 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 111 |    executor = ThreadPoolExecutor(max_workers=2) | 
 | 112 |    a = executor.submit(wait_on_b) | 
 | 113 |    b = executor.submit(wait_on_a) | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 114 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 115 | And:: | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 116 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 117 |    def wait_on_future(): | 
 | 118 |        f = executor.submit(pow, 5, 2) | 
 | 119 |        # This will never complete because there is only one worker thread and | 
 | 120 |        # it is executing this function. | 
 | 121 |        print(f.result()) | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 122 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 123 |    executor = ThreadPoolExecutor(max_workers=1) | 
 | 124 |    executor.submit(wait_on_future) | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 125 |  | 
 | 126 |  | 
| Guido van Rossum | cfd4661 | 2014-09-02 10:39:18 -0700 | [diff] [blame] | 127 | .. class:: ThreadPoolExecutor(max_workers=None) | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 128 |  | 
 | 129 |    An :class:`Executor` subclass that uses a pool of at most *max_workers* | 
 | 130 |    threads to execute calls asynchronously. | 
 | 131 |  | 
| Guido van Rossum | cfd4661 | 2014-09-02 10:39:18 -0700 | [diff] [blame] | 132 |    .. versionchanged:: 3.5 | 
 | 133 |       If *max_workers* is ``None`` or | 
 | 134 |       not given, it will default to the number of processors on the machine, | 
 | 135 |       multiplied by ``5``, assuming that :class:`ThreadPoolExecutor` is often | 
 | 136 |       used to overlap I/O instead of CPU work and the number of workers | 
 | 137 |       should be higher than the number of workers | 
 | 138 |       for :class:`ProcessPoolExecutor`. | 
 | 139 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 140 |  | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 141 | .. _threadpoolexecutor-example: | 
 | 142 |  | 
 | 143 | ThreadPoolExecutor Example | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 144 | ~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 145 | :: | 
 | 146 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 147 |    import concurrent.futures | 
 | 148 |    import urllib.request | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 149 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 150 |    URLS = ['http://www.foxnews.com/', | 
 | 151 |            'http://www.cnn.com/', | 
 | 152 |            'http://europe.wsj.com/', | 
 | 153 |            'http://www.bbc.co.uk/', | 
 | 154 |            'http://some-made-up-domain.com/'] | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 155 |  | 
| Nick Coghlan | f06ea25 | 2012-10-16 22:50:04 +1000 | [diff] [blame] | 156 |    # Retrieve a single page and report the url and contents | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 157 |    def load_url(url, timeout): | 
| Berker Peksag | 9575e18 | 2015-04-12 13:52:49 +0300 | [diff] [blame] | 158 |        with urllib.request.urlopen(url, timeout=timeout) as conn: | 
 | 159 |            return conn.read() | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 160 |  | 
| Nick Coghlan | f06ea25 | 2012-10-16 22:50:04 +1000 | [diff] [blame] | 161 |    # 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] | 162 |    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: | 
| Nick Coghlan | f06ea25 | 2012-10-16 22:50:04 +1000 | [diff] [blame] | 163 |        # Start the load operations and mark each future with its URL | 
| Georg Brandl | 0a1bc11 | 2013-03-23 15:59:46 +0100 | [diff] [blame] | 164 |        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] | 165 |        for future in concurrent.futures.as_completed(future_to_url): | 
| Nick Coghlan | 40c6773 | 2012-10-20 20:13:21 +1000 | [diff] [blame] | 166 |            url = future_to_url[future] | 
| Nick Coghlan | f06ea25 | 2012-10-16 22:50:04 +1000 | [diff] [blame] | 167 |            try: | 
 | 168 |                data = future.result() | 
 | 169 |            except Exception as exc: | 
 | 170 |                print('%r generated an exception: %s' % (url, exc)) | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 171 |            else: | 
| Nick Coghlan | f06ea25 | 2012-10-16 22:50:04 +1000 | [diff] [blame] | 172 |                print('%r page is %d bytes' % (url, len(data))) | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 173 |  | 
 | 174 |  | 
 | 175 | ProcessPoolExecutor | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 176 | ------------------- | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 177 |  | 
 | 178 | The :class:`ProcessPoolExecutor` class is an :class:`Executor` subclass that | 
 | 179 | uses a pool of processes to execute calls asynchronously. | 
 | 180 | :class:`ProcessPoolExecutor` uses the :mod:`multiprocessing` module, which | 
 | 181 | allows it to side-step the :term:`Global Interpreter Lock` but also means that | 
 | 182 | only picklable objects can be executed and returned. | 
 | 183 |  | 
| bquinlan | 7749cb5 | 2013-10-26 04:49:55 +1100 | [diff] [blame] | 184 | The ``__main__`` module must be importable by worker subprocesses. This means | 
 | 185 | that :class:`ProcessPoolExecutor` will not work in the interactive interpreter. | 
 | 186 |  | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 187 | Calling :class:`Executor` or :class:`Future` methods from a callable submitted | 
 | 188 | to a :class:`ProcessPoolExecutor` will result in deadlock. | 
 | 189 |  | 
 | 190 | .. class:: ProcessPoolExecutor(max_workers=None) | 
 | 191 |  | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 192 |    An :class:`Executor` subclass that executes calls asynchronously using a pool | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 193 |    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] | 194 |    given, it will default to the number of processors on the machine. | 
| Brian Quinlan | 20efceb | 2014-05-17 13:51:10 -0700 | [diff] [blame] | 195 |    If *max_workers* is lower or equal to ``0``, then a :exc:`ValueError` | 
 | 196 |    will be raised. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 197 |  | 
| Antoine Pitrou | dd69649 | 2011-06-08 17:21:55 +0200 | [diff] [blame] | 198 |    .. versionchanged:: 3.3 | 
 | 199 |       When one of the worker processes terminates abruptly, a | 
 | 200 |       :exc:`BrokenProcessPool` error is now raised.  Previously, behaviour | 
 | 201 |       was undefined but operations on the executor or its futures would often | 
 | 202 |       freeze or deadlock. | 
 | 203 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 204 |  | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 205 | .. _processpoolexecutor-example: | 
 | 206 |  | 
 | 207 | ProcessPoolExecutor Example | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 208 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 209 | :: | 
 | 210 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 211 |    import concurrent.futures | 
 | 212 |    import math | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 213 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 214 |    PRIMES = [ | 
 | 215 |        112272535095293, | 
 | 216 |        112582705942171, | 
 | 217 |        112272535095293, | 
 | 218 |        115280095190773, | 
 | 219 |        115797848077099, | 
 | 220 |        1099726899285419] | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 221 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 222 |    def is_prime(n): | 
 | 223 |        if n % 2 == 0: | 
 | 224 |            return False | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 225 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 226 |        sqrt_n = int(math.floor(math.sqrt(n))) | 
 | 227 |        for i in range(3, sqrt_n + 1, 2): | 
 | 228 |            if n % i == 0: | 
 | 229 |                return False | 
 | 230 |        return True | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 231 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 232 |    def main(): | 
 | 233 |        with concurrent.futures.ProcessPoolExecutor() as executor: | 
 | 234 |            for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)): | 
 | 235 |                print('%d is prime: %s' % (number, prime)) | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 236 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 237 |    if __name__ == '__main__': | 
 | 238 |        main() | 
 | 239 |  | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 240 |  | 
 | 241 | Future Objects | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 242 | -------------- | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 243 |  | 
| Georg Brandl | 6faee4e | 2010-09-21 14:48:28 +0000 | [diff] [blame] | 244 | The :class:`Future` class encapsulates the asynchronous execution of a callable. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 245 | :class:`Future` instances are created by :meth:`Executor.submit`. | 
 | 246 |  | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 247 | .. class:: Future | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 248 |  | 
| Georg Brandl | 6faee4e | 2010-09-21 14:48:28 +0000 | [diff] [blame] | 249 |    Encapsulates the asynchronous execution of a callable.  :class:`Future` | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 250 |    instances are created by :meth:`Executor.submit` and should not be created | 
 | 251 |    directly except for testing. | 
 | 252 |  | 
 | 253 |     .. method:: cancel() | 
 | 254 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 255 |        Attempt to cancel the call.  If the call is currently being executed and | 
| Eric Smith | 7b5011b | 2011-02-01 21:31:22 +0000 | [diff] [blame] | 256 |        cannot be cancelled then the method will return ``False``, otherwise the | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 257 |        call will be cancelled and the method will return ``True``. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 258 |  | 
 | 259 |     .. method:: cancelled() | 
 | 260 |  | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 261 |        Return ``True`` if the call was successfully cancelled. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 262 |  | 
 | 263 |     .. method:: running() | 
 | 264 |  | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 265 |        Return ``True`` if the call is currently being executed and cannot be | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 266 |        cancelled. | 
 | 267 |  | 
 | 268 |     .. method:: done() | 
 | 269 |  | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 270 |        Return ``True`` if the call was successfully cancelled or finished | 
 | 271 |        running. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 272 |  | 
 | 273 |     .. method:: result(timeout=None) | 
 | 274 |  | 
 | 275 |        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] | 276 |        then this method will wait up to *timeout* seconds.  If the call hasn't | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 277 |        completed in *timeout* seconds, then a :exc:`TimeoutError` will be | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 278 |        raised. *timeout* can be an int or float.  If *timeout* is not specified | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 279 |        or ``None``, there is no limit to the wait time. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 280 |  | 
 | 281 |        If the future is cancelled before completing then :exc:`CancelledError` | 
 | 282 |        will be raised. | 
 | 283 |  | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 284 |        If the call raised, this method will raise the same exception. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 285 |  | 
 | 286 |     .. method:: exception(timeout=None) | 
 | 287 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 288 |        Return the exception raised by the call.  If the call hasn't yet | 
 | 289 |        completed then this method will wait up to *timeout* seconds.  If the | 
 | 290 |        call hasn't completed in *timeout* seconds, then a :exc:`TimeoutError` | 
 | 291 |        will be raised.  *timeout* can be an int or float.  If *timeout* is not | 
 | 292 |        specified or ``None``, there is no limit to the wait time. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 293 |  | 
 | 294 |        If the future is cancelled before completing then :exc:`CancelledError` | 
 | 295 |        will be raised. | 
 | 296 |  | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 297 |        If the call completed without raising, ``None`` is returned. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 298 |  | 
 | 299 |     .. method:: add_done_callback(fn) | 
 | 300 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 301 |        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] | 302 |        future as its only argument, when the future is cancelled or finishes | 
 | 303 |        running. | 
 | 304 |  | 
 | 305 |        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] | 306 |        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] | 307 |        the callable raises an :exc:`Exception` subclass, it will be logged and | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 308 |        ignored.  If the callable raises a :exc:`BaseException` subclass, the | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 309 |        behavior is undefined. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 310 |  | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 311 |        If the future has already completed or been cancelled, *fn* will be | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 312 |        called immediately. | 
 | 313 |  | 
 | 314 |    The following :class:`Future` methods are meant for use in unit tests and | 
 | 315 |    :class:`Executor` implementations. | 
 | 316 |  | 
 | 317 |     .. method:: set_running_or_notify_cancel() | 
 | 318 |  | 
 | 319 |        This method should only be called by :class:`Executor` implementations | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 320 |        before executing the work associated with the :class:`Future` and by unit | 
 | 321 |        tests. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 322 |  | 
| Senthil Kumaran | 916bd38 | 2010-10-15 12:55:19 +0000 | [diff] [blame] | 323 |        If the method returns ``False`` then the :class:`Future` was cancelled, | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 324 |        i.e. :meth:`Future.cancel` was called and returned `True`.  Any threads | 
 | 325 |        waiting on the :class:`Future` completing (i.e. through | 
 | 326 |        :func:`as_completed` or :func:`wait`) will be woken up. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 327 |  | 
| Senthil Kumaran | 916bd38 | 2010-10-15 12:55:19 +0000 | [diff] [blame] | 328 |        If the method returns ``True`` then the :class:`Future` was not cancelled | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 329 |        and has been put in the running state, i.e. calls to | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 330 |        :meth:`Future.running` will return `True`. | 
 | 331 |  | 
 | 332 |        This method can only be called once and cannot be called after | 
 | 333 |        :meth:`Future.set_result` or :meth:`Future.set_exception` have been | 
 | 334 |        called. | 
 | 335 |  | 
 | 336 |     .. method:: set_result(result) | 
 | 337 |  | 
 | 338 |        Sets the result of the work associated with the :class:`Future` to | 
 | 339 |        *result*. | 
 | 340 |  | 
 | 341 |        This method should only be used by :class:`Executor` implementations and | 
 | 342 |        unit tests. | 
 | 343 |  | 
 | 344 |     .. method:: set_exception(exception) | 
 | 345 |  | 
 | 346 |        Sets the result of the work associated with the :class:`Future` to the | 
 | 347 |        :class:`Exception` *exception*. | 
 | 348 |  | 
 | 349 |        This method should only be used by :class:`Executor` implementations and | 
 | 350 |        unit tests. | 
 | 351 |  | 
 | 352 |  | 
 | 353 | Module Functions | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 354 | ---------------- | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 355 |  | 
 | 356 | .. function:: wait(fs, timeout=None, return_when=ALL_COMPLETED) | 
 | 357 |  | 
 | 358 |    Wait for the :class:`Future` instances (possibly created by different | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 359 |    :class:`Executor` instances) given by *fs* to complete.  Returns a named | 
 | 360 |    2-tuple of sets.  The first set, named ``done``, contains the futures that | 
 | 361 |    completed (finished or were cancelled) before the wait completed.  The second | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 362 |    set, named ``not_done``, contains uncompleted futures. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 363 |  | 
 | 364 |    *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] | 365 |    returning.  *timeout* can be an int or float.  If *timeout* is not specified | 
 | 366 |    or ``None``, there is no limit to the wait time. | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 367 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 368 |    *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] | 369 |    the following constants: | 
 | 370 |  | 
| Georg Brandl | 44ea77b | 2013-03-28 13:28:44 +0100 | [diff] [blame] | 371 |    .. tabularcolumns:: |l|L| | 
 | 372 |  | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 373 |    +-----------------------------+----------------------------------------+ | 
 | 374 |    | Constant                    | Description                            | | 
 | 375 |    +=============================+========================================+ | 
 | 376 |    | :const:`FIRST_COMPLETED`    | The function will return when any      | | 
 | 377 |    |                             | future finishes or is cancelled.       | | 
 | 378 |    +-----------------------------+----------------------------------------+ | 
 | 379 |    | :const:`FIRST_EXCEPTION`    | The function will return when any      | | 
 | 380 |    |                             | future finishes by raising an          | | 
 | 381 |    |                             | exception.  If no future raises an     | | 
 | 382 |    |                             | exception then it is equivalent to     | | 
 | 383 |    |                             | :const:`ALL_COMPLETED`.                | | 
 | 384 |    +-----------------------------+----------------------------------------+ | 
 | 385 |    | :const:`ALL_COMPLETED`      | The function will return when all      | | 
 | 386 |    |                             | futures finish or are cancelled.       | | 
 | 387 |    +-----------------------------+----------------------------------------+ | 
| Brian Quinlan | 81c4d36 | 2010-09-18 22:35:02 +0000 | [diff] [blame] | 388 |  | 
 | 389 | .. function:: as_completed(fs, timeout=None) | 
 | 390 |  | 
| Benjamin Peterson | c713fc7 | 2010-09-19 04:23:17 +0000 | [diff] [blame] | 391 |    Returns an iterator over the :class:`Future` instances (possibly created by | 
 | 392 |    different :class:`Executor` instances) given by *fs* that yields futures as | 
| Guido van Rossum | e6994ff | 2014-01-26 09:57:51 -0800 | [diff] [blame] | 393 |    they complete (finished or were cancelled). Any futures given by *fs* that | 
 | 394 |    are duplicated will be returned once. Any futures that completed | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 395 |    before :func:`as_completed` is called will be yielded first.  The returned | 
| Ezio Melotti | 7fa8222 | 2012-10-12 13:42:08 +0300 | [diff] [blame] | 396 |    iterator raises a :exc:`TimeoutError` if :meth:`~iterator.__next__` is | 
 | 397 |    called and the result isn't available after *timeout* seconds from the | 
 | 398 |    original call to :func:`as_completed`.  *timeout* can be an int or float. | 
 | 399 |    If *timeout* is not specified or ``None``, there is no limit to the wait | 
 | 400 |    time. | 
| Georg Brandl | 035cedb | 2010-09-19 09:31:09 +0000 | [diff] [blame] | 401 |  | 
 | 402 |  | 
 | 403 | .. seealso:: | 
 | 404 |  | 
 | 405 |    :pep:`3148` -- futures - execute computations asynchronously | 
 | 406 |       The proposal which described this feature for inclusion in the Python | 
 | 407 |       standard library. | 
| Antoine Pitrou | dd69649 | 2011-06-08 17:21:55 +0200 | [diff] [blame] | 408 |  | 
 | 409 |  | 
 | 410 | Exception classes | 
 | 411 | ----------------- | 
 | 412 |  | 
| Georg Brandl | ce64ced | 2014-10-28 22:58:24 +0100 | [diff] [blame] | 413 | .. currentmodule:: concurrent.futures.process | 
 | 414 |  | 
| Antoine Pitrou | dd69649 | 2011-06-08 17:21:55 +0200 | [diff] [blame] | 415 | .. exception:: BrokenProcessPool | 
 | 416 |  | 
 | 417 |    Derived from :exc:`RuntimeError`, this exception class is raised when | 
 | 418 |    one of the workers of a :class:`ProcessPoolExecutor` has terminated | 
 | 419 |    in a non-clean fashion (for example, if it was killed from the outside). | 
 | 420 |  | 
 | 421 |    .. versionadded:: 3.3 | 
 | 422 |  |