- オブジェクトの破棄と Drop の振り返り
- ソフトウェアにおける一般的なクリーンアップ要件
- async に関する問題
- クリーンアップ中に非同期で何かを行いたい場合がある。例: 最後のメッセージを送信する
- まだ非同期的に使用されているものをクリーンアップする必要がある場合がある
- async タスクが完了またはキャンセルされ、それを捕捉する方法がない場合にクリーンアップしたい場合がある
- クリーンアップフェーズ中のランタイムの状態(特にパニック中などの場合)
- async Drop はない
- completion io トピックへの前方参照
- どのように発生するか(more-async-await.md の振り返り)
- future を drop する
- キャンセルトークン
- abort 関数
- キャンセルを「捕捉」するために何ができるか
- キャンセルが他の future タスクにどのように影響するか(キャンセル安全性の章への前方参照。ここでは注意喚起に留める)
- タスク間でのパニックの伝播(spawn の結果)
- パニックによりデータが不整合な状態で残ること(tokio のミューテックス)
- パニック中に async コードを呼び出すこと(絶対に行わないようにする)
- クリーンアップが必要にならないようにする(abort/restart)
- クリーンアップに async を使用せず、あまり心配しすぎない
- async クリーンアップメソッド + dtor bomb(つまり、クリーンアップを破棄から分離する)
- クリーンアップを別のタスク、スレッド、または supervisor オブジェクト/プロセスに集約/外部委託する
- https://tokio.rs/tokio/topics/shutdown
- これは高度なセクションであり、読む必要はないことに注意
- async Drop が難しい理由
- 考えられる解決策とその問題点
- 現在の状況