源代码: Lib/asyncio/futures.py , Lib/asyncio/base_futures.py
Future 对象用于桥接 基于回调的低级代码 采用高级 async/await 代码。
asyncio.
isfuture
(
obj
)
¶
返回
True
if
obj
is either of:
an instance of
asyncio.Future
,
an instance of
asyncio.Task
,
a Future-like object with a
_asyncio_future_blocking
属性。
3.5 版新增。
asyncio.
ensure_future
(
obj
,
*
,
loop=None
)
¶
返回:
obj
argument as is, if
obj
是
Future
,
Task
, or a Future-like object (
isfuture()
is used for the test.)
a
Task
object wrapping
obj
, if
obj
is a coroutine (
iscoroutine()
is used for the test); in this case the coroutine will be scheduled by
ensure_future()
.
a
Task
object that would await on
obj
, if
obj
is an awaitable (
inspect.isawaitable()
is used for the test.)
若
obj
is neither of the above a
TypeError
被引发。
Important
另请参阅
create_task()
function which is the preferred way for creating new Tasks.
3.5.1 版改变: The function accepts any awaitable 对象。
asyncio.
wrap_future
(
future
,
*
,
loop=None
)
¶
包裹
concurrent.futures.Future
对象在
asyncio.Future
对象。
asyncio.
Future
(
*
,
loop=None
)
¶
A Future represents an eventual result of an asynchronous operation. Not thread-safe.
Future 是 awaitable object. Coroutines can await on Future objects until they either have a result or an exception set, or until they are cancelled.
Typically Futures are used to enable low-level callback-based code (e.g. in protocols implemented using asyncio 传输 ) to interoperate with high-level async/await code.
The rule of thumb is to never expose Future objects in user-facing APIs, and the recommended way to create a Future object is to call
loop.create_future()
. This way alternative event loop implementations can inject their own optimized implementations of a Future object.
3.7 版改变:
添加支持
contextvars
模块。
result
(
)
¶
返回 Future 的结果。
If the Future is
done
and has a result set by the
set_result()
method, the result value is returned.
If the Future is
done
and has an exception set by the
set_exception()
method, this method raises the exception.
If the Future has been
cancelled
, this method raises a
CancelledError
异常。
If the Future’s result isn’t yet available, this method raises a
InvalidStateError
异常。
set_result
(
result
)
¶
Mark the Future as done and set its result.
引发
InvalidStateError
error if the Future is already
done
.
set_exception
(
exception
)
¶
Mark the Future as done and set an exception.
引发
InvalidStateError
error if the Future is already
done
.
done
(
)
¶
返回
True
if the Future is
done
.
A Future is
done
if it was
cancelled
or if it has a result or an exception set with
set_result()
or
set_exception()
调用。
cancelled
(
)
¶
返回
True
if the Future was
cancelled
.
The method is usually used to check if a Future is not cancelled before setting a result or an exception for it:
if not fut.cancelled():
fut.set_result(42)
add_done_callback
(
callback
,
*
,
context=None
)
¶
Add a callback to be run when the Future is done .
callback is called with the Future object as its only argument.
If the Future is already
done
when this method is called, the callback is scheduled with
loop.call_soon()
.
An optional keyword-only
context
argument allows specifying a custom
contextvars.Context
为
callback
to run in. The current context is used when no
context
is provided.
functools.partial()
can be used to pass parameters to the callback, e.g.:
# Call 'print("Future:", fut)' when "fut" is done.
fut.add_done_callback(
functools.partial(print, "Future:"))
3.7 版改变: context keyword-only parameter was added. See PEP 567 了解更多细节。
remove_done_callback
(
callback
)
¶
移除 callback 从回调列表。
Returns the number of callbacks removed, which is typically 1, unless a callback was added more than once.
cancel
(
msg=None
)
¶
Cancel the Future and schedule callbacks.
If the Future is already
done
or
cancelled
,返回
False
. Otherwise, change the Future’s state to
cancelled
, schedule the callbacks, and return
True
.
3.9 版改变:
添加
msg
参数。
exception
(
)
¶
Return the exception that was set on this Future.
The exception (or
None
if no exception was set) is returned only if the Future is
done
.
If the Future has been
cancelled
, this method raises a
CancelledError
异常。
If the Future isn’t
done
yet, this method raises an
InvalidStateError
异常。
get_loop
(
)
¶
Return the event loop the Future object is bound to.
3.7 版新增。
This example creates a Future object, creates and schedules an asynchronous Task to set result for the Future, and waits until the Future has a result:
async def set_after(fut, delay, value):
# Sleep for *delay* seconds.
await asyncio.sleep(delay)
# Set *value* as a result of *fut* Future.
fut.set_result(value)
async def main():
# Get the current event loop.
loop = asyncio.get_running_loop()
# Create a new Future object.
fut = loop.create_future()
# Run "set_after()" coroutine in a parallel Task.
# We are using the low-level "loop.create_task()" API here because
# we already have a reference to the event loop at hand.
# Otherwise we could have just used "asyncio.create_task()".
loop.create_task(
set_after(fut, 1, '... world'))
print('hello ...')
# Wait until *fut* has a result (1 second) and print it.
print(await fut)
asyncio.run(main())
Important
The Future object was designed to mimic
concurrent.futures.Future
. Key differences include:
unlike asyncio Futures,
concurrent.futures.Future
instances cannot be awaited.
asyncio.Future.result()
and
asyncio.Future.exception()
do not accept the
timeout
自变量。
asyncio.Future.result()
and
asyncio.Future.exception()
raise an
InvalidStateError
exception when the Future is not
done
.
Callbacks registered with
asyncio.Future.add_done_callback()
are not called immediately. They are scheduled with
loop.call_soon()
代替。
asyncio Future is not compatible with the
concurrent.futures.wait()
and
concurrent.futures.as_completed()
函数。
asyncio.Future.cancel()
accepts an optional
msg
argument, but
concurrent.futures.cancel()
does not.