web-dev-qa-db-ja.com

コンカレント.futures.as_completedはどのように機能しますか?

私はpython並行性について学び、先物の概念を紹介しました。as_completed()は先物の反復可能性を取り、それらが完了するとそれらを生成することを読みました。

内部でどのように機能するのか知りたいです。完了したタスク(将来)をすぐに生成しますか?素朴なアプローチは、すべての先物を繰り返し、done()を使用してすべての先物を調べることですが、これは非効率的です。

では、この関数の背後にある魔法は何ですか?

ありがとう!

10
blueplusgreen

内部でどのように機能するのか知りたいです。

as_completedは、先物が完了したときに起動するコールバックを設定し、受信するすべての先物に対して起動します。 (この目的のために add_done_callback と同等の内部APIを使用します。)先物のいずれかが完了すると、as_completedはコールバックが実行されていることによって通知されます。コールバックは、将来完了したスレッドで実行されるため、すべてのコールバックで共有され、as_completedがスリープする event のみを設定します。イベントによって目覚めたら、as_completedはすぐに完成した未来を生み出します。これは、as_completedが、先物が発生する順序に関係なく、完了時に先物が確実に生成されるようにする方法です。譲歩後、イベントはクリアされ、すべての先物が完了するまで待機が繰り返されます。

完了したタスク(将来)をすぐに生成しますか?

はい、それは 文書化されたインターフェース実装 の両方から続きます。

11
user4815162342