キャンセル
Future をドロップすると、その Future を再度ポーリングすることはできません。これはキャンセルと呼ばれ、どの await
ポイントでも発生する可能性があります。そのため、Future がキャンセルされた場合でも、システムが正常に動作するようにしておく必要があります。たとえば、デッドロックやデータの消失があってはなりません。
Speaker Notes
This slide should take about 18 minutes.
-
コンパイラではキャンセル安全性を確保できません。API ドキュメントを読み、
async fn
が保持する状態を考慮する必要があります。 -
panic
や?
とは異なり、キャンセルは(エラー処理ではなく)通常の制御フローの一部です。 -
この例では、文字列の一部が失われています。
-
tick()
分岐が先に終了するたびに、next()
とそのbuf
がドロップされます。 -
buf
を構造体の一部にすることで、LinesReader
にキャンセル安全性を持たせることができます。
-
-
Interval::tick
は、ティックが「配信済み」かどうかを追跡しているため、安全にキャンセルできます。 -
AsyncReadExt::read
は、データを返すか、データを読み取らないかのいずれかであるため、安全にキャンセルできます。 -
AsyncBufReadExt::read_line
はこの例と類似しており、安全にキャンセルできません。詳細と代替方法については、ドキュメントをご覧ください。