17db96d56Sopenharmony_ci.. currentmodule:: asyncio 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci.. _asyncio-futures: 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ci======= 77db96d56Sopenharmony_ciFutures 87db96d56Sopenharmony_ci======= 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ci**Source code:** :source:`Lib/asyncio/futures.py`, 117db96d56Sopenharmony_ci:source:`Lib/asyncio/base_futures.py` 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ci------------------------------------- 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ci*Future* objects are used to bridge **low-level callback-based code** 167db96d56Sopenharmony_ciwith high-level async/await code. 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ciFuture Functions 207db96d56Sopenharmony_ci================ 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci.. function:: isfuture(obj) 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci Return ``True`` if *obj* is either of: 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ci * an instance of :class:`asyncio.Future`, 277db96d56Sopenharmony_ci * an instance of :class:`asyncio.Task`, 287db96d56Sopenharmony_ci * a Future-like object with a ``_asyncio_future_blocking`` 297db96d56Sopenharmony_ci attribute. 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci .. versionadded:: 3.5 327db96d56Sopenharmony_ci 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci.. function:: ensure_future(obj, *, loop=None) 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci Return: 377db96d56Sopenharmony_ci 387db96d56Sopenharmony_ci * *obj* argument as is, if *obj* is a :class:`Future`, 397db96d56Sopenharmony_ci a :class:`Task`, or a Future-like object (:func:`isfuture` 407db96d56Sopenharmony_ci is used for the test.) 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ci * a :class:`Task` object wrapping *obj*, if *obj* is a 437db96d56Sopenharmony_ci coroutine (:func:`iscoroutine` is used for the test); 447db96d56Sopenharmony_ci in this case the coroutine will be scheduled by 457db96d56Sopenharmony_ci ``ensure_future()``. 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ci * a :class:`Task` object that would await on *obj*, if *obj* is an 487db96d56Sopenharmony_ci awaitable (:func:`inspect.isawaitable` is used for the test.) 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_ci If *obj* is neither of the above a :exc:`TypeError` is raised. 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ci .. important:: 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci See also the :func:`create_task` function which is the 557db96d56Sopenharmony_ci preferred way for creating new Tasks. 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci Save a reference to the result of this function, to avoid 587db96d56Sopenharmony_ci a task disappearing mid-execution. 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ci .. versionchanged:: 3.5.1 617db96d56Sopenharmony_ci The function accepts any :term:`awaitable` object. 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci .. deprecated:: 3.10 647db96d56Sopenharmony_ci Deprecation warning is emitted if *obj* is not a Future-like object 657db96d56Sopenharmony_ci and *loop* is not specified and there is no running event loop. 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_ci.. function:: wrap_future(future, *, loop=None) 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci Wrap a :class:`concurrent.futures.Future` object in a 717db96d56Sopenharmony_ci :class:`asyncio.Future` object. 727db96d56Sopenharmony_ci 737db96d56Sopenharmony_ci .. deprecated:: 3.10 747db96d56Sopenharmony_ci Deprecation warning is emitted if *future* is not a Future-like object 757db96d56Sopenharmony_ci and *loop* is not specified and there is no running event loop. 767db96d56Sopenharmony_ci 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_ciFuture Object 797db96d56Sopenharmony_ci============= 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ci.. class:: Future(*, loop=None) 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci A Future represents an eventual result of an asynchronous 847db96d56Sopenharmony_ci operation. Not thread-safe. 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci Future is an :term:`awaitable` object. Coroutines can await on 877db96d56Sopenharmony_ci Future objects until they either have a result or an exception 887db96d56Sopenharmony_ci set, or until they are cancelled. A Future can be awaited multiple 897db96d56Sopenharmony_ci times and the result is same. 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ci Typically Futures are used to enable low-level 927db96d56Sopenharmony_ci callback-based code (e.g. in protocols implemented using asyncio 937db96d56Sopenharmony_ci :ref:`transports <asyncio-transports-protocols>`) 947db96d56Sopenharmony_ci to interoperate with high-level async/await code. 957db96d56Sopenharmony_ci 967db96d56Sopenharmony_ci The rule of thumb is to never expose Future objects in user-facing 977db96d56Sopenharmony_ci APIs, and the recommended way to create a Future object is to call 987db96d56Sopenharmony_ci :meth:`loop.create_future`. This way alternative event loop 997db96d56Sopenharmony_ci implementations can inject their own optimized implementations 1007db96d56Sopenharmony_ci of a Future object. 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci .. versionchanged:: 3.7 1037db96d56Sopenharmony_ci Added support for the :mod:`contextvars` module. 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ci .. deprecated:: 3.10 1067db96d56Sopenharmony_ci Deprecation warning is emitted if *loop* is not specified 1077db96d56Sopenharmony_ci and there is no running event loop. 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci .. method:: result() 1107db96d56Sopenharmony_ci 1117db96d56Sopenharmony_ci Return the result of the Future. 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci If the Future is *done* and has a result set by the 1147db96d56Sopenharmony_ci :meth:`set_result` method, the result value is returned. 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci If the Future is *done* and has an exception set by the 1177db96d56Sopenharmony_ci :meth:`set_exception` method, this method raises the exception. 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci If the Future has been *cancelled*, this method raises 1207db96d56Sopenharmony_ci a :exc:`CancelledError` exception. 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci If the Future's result isn't yet available, this method raises 1237db96d56Sopenharmony_ci a :exc:`InvalidStateError` exception. 1247db96d56Sopenharmony_ci 1257db96d56Sopenharmony_ci .. method:: set_result(result) 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci Mark the Future as *done* and set its result. 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci Raises a :exc:`InvalidStateError` error if the Future is 1307db96d56Sopenharmony_ci already *done*. 1317db96d56Sopenharmony_ci 1327db96d56Sopenharmony_ci .. method:: set_exception(exception) 1337db96d56Sopenharmony_ci 1347db96d56Sopenharmony_ci Mark the Future as *done* and set an exception. 1357db96d56Sopenharmony_ci 1367db96d56Sopenharmony_ci Raises a :exc:`InvalidStateError` error if the Future is 1377db96d56Sopenharmony_ci already *done*. 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_ci .. method:: done() 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ci Return ``True`` if the Future is *done*. 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ci A Future is *done* if it was *cancelled* or if it has a result 1447db96d56Sopenharmony_ci or an exception set with :meth:`set_result` or 1457db96d56Sopenharmony_ci :meth:`set_exception` calls. 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ci .. method:: cancelled() 1487db96d56Sopenharmony_ci 1497db96d56Sopenharmony_ci Return ``True`` if the Future was *cancelled*. 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ci The method is usually used to check if a Future is not 1527db96d56Sopenharmony_ci *cancelled* before setting a result or an exception for it:: 1537db96d56Sopenharmony_ci 1547db96d56Sopenharmony_ci if not fut.cancelled(): 1557db96d56Sopenharmony_ci fut.set_result(42) 1567db96d56Sopenharmony_ci 1577db96d56Sopenharmony_ci .. method:: add_done_callback(callback, *, context=None) 1587db96d56Sopenharmony_ci 1597db96d56Sopenharmony_ci Add a callback to be run when the Future is *done*. 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_ci The *callback* is called with the Future object as its only 1627db96d56Sopenharmony_ci argument. 1637db96d56Sopenharmony_ci 1647db96d56Sopenharmony_ci If the Future is already *done* when this method is called, 1657db96d56Sopenharmony_ci the callback is scheduled with :meth:`loop.call_soon`. 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci An optional keyword-only *context* argument allows specifying a 1687db96d56Sopenharmony_ci custom :class:`contextvars.Context` for the *callback* to run in. 1697db96d56Sopenharmony_ci The current context is used when no *context* is provided. 1707db96d56Sopenharmony_ci 1717db96d56Sopenharmony_ci :func:`functools.partial` can be used to pass parameters 1727db96d56Sopenharmony_ci to the callback, e.g.:: 1737db96d56Sopenharmony_ci 1747db96d56Sopenharmony_ci # Call 'print("Future:", fut)' when "fut" is done. 1757db96d56Sopenharmony_ci fut.add_done_callback( 1767db96d56Sopenharmony_ci functools.partial(print, "Future:")) 1777db96d56Sopenharmony_ci 1787db96d56Sopenharmony_ci .. versionchanged:: 3.7 1797db96d56Sopenharmony_ci The *context* keyword-only parameter was added. 1807db96d56Sopenharmony_ci See :pep:`567` for more details. 1817db96d56Sopenharmony_ci 1827db96d56Sopenharmony_ci .. method:: remove_done_callback(callback) 1837db96d56Sopenharmony_ci 1847db96d56Sopenharmony_ci Remove *callback* from the callbacks list. 1857db96d56Sopenharmony_ci 1867db96d56Sopenharmony_ci Returns the number of callbacks removed, which is typically 1, 1877db96d56Sopenharmony_ci unless a callback was added more than once. 1887db96d56Sopenharmony_ci 1897db96d56Sopenharmony_ci .. method:: cancel(msg=None) 1907db96d56Sopenharmony_ci 1917db96d56Sopenharmony_ci Cancel the Future and schedule callbacks. 1927db96d56Sopenharmony_ci 1937db96d56Sopenharmony_ci If the Future is already *done* or *cancelled*, return ``False``. 1947db96d56Sopenharmony_ci Otherwise, change the Future's state to *cancelled*, 1957db96d56Sopenharmony_ci schedule the callbacks, and return ``True``. 1967db96d56Sopenharmony_ci 1977db96d56Sopenharmony_ci .. versionchanged:: 3.9 1987db96d56Sopenharmony_ci Added the *msg* parameter. 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_ci .. method:: exception() 2017db96d56Sopenharmony_ci 2027db96d56Sopenharmony_ci Return the exception that was set on this Future. 2037db96d56Sopenharmony_ci 2047db96d56Sopenharmony_ci The exception (or ``None`` if no exception was set) is 2057db96d56Sopenharmony_ci returned only if the Future is *done*. 2067db96d56Sopenharmony_ci 2077db96d56Sopenharmony_ci If the Future has been *cancelled*, this method raises a 2087db96d56Sopenharmony_ci :exc:`CancelledError` exception. 2097db96d56Sopenharmony_ci 2107db96d56Sopenharmony_ci If the Future isn't *done* yet, this method raises an 2117db96d56Sopenharmony_ci :exc:`InvalidStateError` exception. 2127db96d56Sopenharmony_ci 2137db96d56Sopenharmony_ci .. method:: get_loop() 2147db96d56Sopenharmony_ci 2157db96d56Sopenharmony_ci Return the event loop the Future object is bound to. 2167db96d56Sopenharmony_ci 2177db96d56Sopenharmony_ci .. versionadded:: 3.7 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_ci 2207db96d56Sopenharmony_ci.. _asyncio_example_future: 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ciThis example creates a Future object, creates and schedules an 2237db96d56Sopenharmony_ciasynchronous Task to set result for the Future, and waits until 2247db96d56Sopenharmony_cithe Future has a result:: 2257db96d56Sopenharmony_ci 2267db96d56Sopenharmony_ci async def set_after(fut, delay, value): 2277db96d56Sopenharmony_ci # Sleep for *delay* seconds. 2287db96d56Sopenharmony_ci await asyncio.sleep(delay) 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ci # Set *value* as a result of *fut* Future. 2317db96d56Sopenharmony_ci fut.set_result(value) 2327db96d56Sopenharmony_ci 2337db96d56Sopenharmony_ci async def main(): 2347db96d56Sopenharmony_ci # Get the current event loop. 2357db96d56Sopenharmony_ci loop = asyncio.get_running_loop() 2367db96d56Sopenharmony_ci 2377db96d56Sopenharmony_ci # Create a new Future object. 2387db96d56Sopenharmony_ci fut = loop.create_future() 2397db96d56Sopenharmony_ci 2407db96d56Sopenharmony_ci # Run "set_after()" coroutine in a parallel Task. 2417db96d56Sopenharmony_ci # We are using the low-level "loop.create_task()" API here because 2427db96d56Sopenharmony_ci # we already have a reference to the event loop at hand. 2437db96d56Sopenharmony_ci # Otherwise we could have just used "asyncio.create_task()". 2447db96d56Sopenharmony_ci loop.create_task( 2457db96d56Sopenharmony_ci set_after(fut, 1, '... world')) 2467db96d56Sopenharmony_ci 2477db96d56Sopenharmony_ci print('hello ...') 2487db96d56Sopenharmony_ci 2497db96d56Sopenharmony_ci # Wait until *fut* has a result (1 second) and print it. 2507db96d56Sopenharmony_ci print(await fut) 2517db96d56Sopenharmony_ci 2527db96d56Sopenharmony_ci asyncio.run(main()) 2537db96d56Sopenharmony_ci 2547db96d56Sopenharmony_ci 2557db96d56Sopenharmony_ci.. important:: 2567db96d56Sopenharmony_ci 2577db96d56Sopenharmony_ci The Future object was designed to mimic 2587db96d56Sopenharmony_ci :class:`concurrent.futures.Future`. Key differences include: 2597db96d56Sopenharmony_ci 2607db96d56Sopenharmony_ci - unlike asyncio Futures, :class:`concurrent.futures.Future` 2617db96d56Sopenharmony_ci instances cannot be awaited. 2627db96d56Sopenharmony_ci 2637db96d56Sopenharmony_ci - :meth:`asyncio.Future.result` and :meth:`asyncio.Future.exception` 2647db96d56Sopenharmony_ci do not accept the *timeout* argument. 2657db96d56Sopenharmony_ci 2667db96d56Sopenharmony_ci - :meth:`asyncio.Future.result` and :meth:`asyncio.Future.exception` 2677db96d56Sopenharmony_ci raise an :exc:`InvalidStateError` exception when the Future is not 2687db96d56Sopenharmony_ci *done*. 2697db96d56Sopenharmony_ci 2707db96d56Sopenharmony_ci - Callbacks registered with :meth:`asyncio.Future.add_done_callback` 2717db96d56Sopenharmony_ci are not called immediately. They are scheduled with 2727db96d56Sopenharmony_ci :meth:`loop.call_soon` instead. 2737db96d56Sopenharmony_ci 2747db96d56Sopenharmony_ci - asyncio Future is not compatible with the 2757db96d56Sopenharmony_ci :func:`concurrent.futures.wait` and 2767db96d56Sopenharmony_ci :func:`concurrent.futures.as_completed` functions. 2777db96d56Sopenharmony_ci 2787db96d56Sopenharmony_ci - :meth:`asyncio.Future.cancel` accepts an optional ``msg`` argument, 2797db96d56Sopenharmony_ci but :func:`concurrent.futures.cancel` does not. 280