Futures —Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.9/library/asyncio-future
移動先:案内検索

先物

ソースコード: :source: `Lib / asyncio / futures.py`, :source: `Lib / asyncio / base_futures.py`



Future オブジェクトは、低レベルのコールバックベースのコードを高レベルの非同期/待機コードとブリッジするために使用されます。

今後の機能

asyncio.isfuture(obj)

obj が次のいずれかである場合、Trueを返します。

  • asyncio.Future のインスタンス、

  • asyncio.Task のインスタンス、

  • _asyncio_future_blocking属性を持つFutureのようなオブジェクト。

バージョン3.5の新機能。

asyncio.ensure_future(obj, *, loop=None)

戻る:

  • obj 引数はそのままです。 objFutureTask 、またはFutureのようなオブジェクト( isfuture( )がテストに使用されます。)

  • obj がコルーチンの場合、 Task オブジェクトラッピング objiscoroutine()がテストに使用されます)。 この場合、コルーチンはensure_future()によってスケジュールされます。

  • obj が待機可能である場合( inspect.isawaitable()がテストに使用される場合、 obj で待機する Task オブジェクト。 )

obj が上記のいずれでもない場合、 TypeError が発生します。

重要

create_task()関数も参照してください。これは、新しいタスクを作成するための推奨される方法です。

バージョン3.5.1で変更:この関数は、待機可能なオブジェクトを受け入れます。

asyncio.wrap_future(future, *, loop=None)
concurrent.futures.Future オブジェクトを asyncio.Future オブジェクトでラップします。


将来のオブジェクト

class asyncio.Future(*, loop=None)

Futureは、非同期操作の最終的な結果を表します。 スレッドセーフではありません。

Futureは awaitable オブジェクトです。 コルーチンは、結果または例外が設定されるまで、またはキャンセルされるまで、Futureオブジェクトを待機できます。

通常、Futuresは、低レベルのコールバックベースのコードを有効にするために使用されます(例: asyncio transports )を使用して実装されたプロトコルで、高レベルのasync / awaitコードと相互運用します。

経験則では、ユーザー向けAPIでFutureオブジェクトを公開しないことです。また、Futureオブジェクトを作成するための推奨される方法は、 loop.create_future()を呼び出すことです。 このようにして、代替のイベントループ実装は、Futureオブジェクトの独自の最適化された実装を挿入できます。

バージョン3.7で変更: contextvars モジュールのサポートが追加されました。

result()

未来の結果を返します。

Futureが done であり、 set_result()メソッドによって結果が設定されている場合、結果値が返されます。

Futureが done であり、 set_exception()メソッドによって例外が設定されている場合、このメソッドは例外を発生させます。

Futureがキャンセルされた場合、このメソッドは CancelledError 例外を発生させます。

Futureの結果がまだ利用できない場合、このメソッドは InvalidStateError 例外を発生させます。

set_result(result)

未来を完了としてマークし、その結果を設定します。

Futureがすでに done である場合、 InvalidStateError エラーが発生します。

set_exception(exception)

Futureを done としてマークし、例外を設定します。

Futureがすでに done である場合、 InvalidStateError エラーが発生します。

done()

Futureが done の場合、Trueを返します。

キャンセルの場合、または set_result()または set_exception()で結果または例外が設定されている場合、Futureは完了です。呼び出します。

cancelled()

Futureがキャンセルされた場合は、Trueを返します。

このメソッドは通常、結果または例外を設定する前に、Futureがキャンセルされていないかどうかを確認するために使用されます。

if not fut.cancelled():
    fut.set_result(42)
add_done_callback(callback, *, context=None)

Futureが完了のときに実行されるコールバックを追加します。

callback は、Futureオブジェクトを唯一の引数として呼び出されます。

このメソッドが呼び出されたときにFutureがすでに done である場合、コールバックは loop.call_soon()でスケジュールされます。

オプションのキーワードのみの context 引数を使用すると、コールバックを実行するカスタム contextvars.Context を指定できます。 現在のコンテキストは、 context が提供されていない場合に使用されます。

functools.partial()を使用して、コールバックにパラメーターを渡すことができます。例:

# Call 'print("Future:", fut)' when "fut" is done.
fut.add_done_callback(
    functools.partial(print, "Future:"))

バージョン3.7で変更: context キーワードのみのパラメーターが追加されました。 詳細については、 PEP 567 を参照してください。

remove_done_callback(callback)

コールバックリストから callback を削除します。

削除されたコールバックの数を返します。コールバックが複数回追加された場合を除き、通常は1です。

cancel(msg=None)

Futureをキャンセルし、コールバックをスケジュールします。

Futureがすでに完了またはキャンセルされている場合は、Falseを返します。 それ以外の場合は、Futureの状態を cancelled に変更し、コールバックをスケジュールして、Trueを返します。

バージョン3.9で変更: msgパラメーターが追加されました。

exception()

このFutureに設定された例外を返します。

例外(または例外が設定されていない場合はNone)は、Futureが done の場合にのみ返されます。

Futureがキャンセルされた場合、このメソッドは CancelledError 例外を発生させます。

Futureがまだ完了されていない場合、このメソッドは InvalidStateError 例外を発生させます。

get_loop()

Futureオブジェクトがバインドされているイベントループを返します。

バージョン3.7の新機能。

この例では、Futureオブジェクトを作成し、非同期タスクを作成してスケジュールし、Futureの結果を設定し、Futureが結果を得るまで待機します。

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())

重要

Futureオブジェクトは、 concurrent.futures.Future を模倣するように設計されています。 主な違いは次のとおりです。