ノート

AstrBot / Async / Images

ImgFlow のバックグラウンド処理数を制限する

バックグラウンド画像タスクを制限し、キャンセル状態を明示し、ローカルファイル操作をイベントループの外へ移した保守メモ。

現象

バックグラウンド画像リクエストは完了より速く受け付けられることがあり、キャンセルとブロッキングファイル処理は汎用の失敗処理に近い形で扱われていました。そのため、待機処理が増え続ける可能性があり、キャンセルと通常エラーの区別が弱く、ローカル画像の読み込みや結果保存がイベントループを占有する境界も残っていました。

対応

新しいタスクを作る前に、設定可能なバックグラウンドタスク上限を確認します。実行中の数が上限に達した場合はリクエストを拒否し、background.rejected 監査イベントを記録します。実行コルーチンが asyncio.CancelledError を捕捉すると、cancelled 状態とコールバック結果を保存してからキャンセルを再送出します。ローカル画像の読み込み、入力解析、途中画像と結果画像の保存には、共通の asyncio.to_thread() 補助関数を使います。

確認

対象を絞ったテストでは利用可能なバックグラウンド枠を埋め、次のリクエストがタスク作成前に拒否されることを確認します。キャンセルテストは保存状態とコールバック内容を確認します。ファイル操作テストはスレッド補助関数を差し替え、ローカル読み込みと保存処理がその関数を通ることを確かめます。対象は設定されたバックグラウンド境界であり、すべての実行器に一つの上限が適用されるという意味ではありません。