> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coreweave.com/llms.txt
> Use this file to discover all available pages before exploring further.

# クリーンアップパターン

> 信頼できるサンドボックスクリーンアップとリソース管理のためのパターン。

これらの例では、`CWSANDBOX_API_KEY` に設定した CoreWeave API アクセストークンを使用します。Forge APIキーによる認証については、[はじめに](/ja/products/sandboxes/get-started)を参照してください。CKS の要件については、[配置モード](/ja/products/sandboxes/placement)を参照してください。

このガイドでは、サンドボックスのリソース管理とクリーンアップ戦略について説明します。信頼できるクリーンアップにより、スクリプト終了後に孤立したサンドボックスが発生するのを防ぎ、コストを予測可能に保ち、意図しないコンピュートリソースの使用を回避できます。ここで紹介するパターンは、明示的なセッションの有無にかかわらず、1 つまたは複数のサンドボックスを作成するスクリプトに適用されます。

<h2 id="automatic-cleanup">
  自動クリーンアップ
</h2>

自動クリーンアップは、サンドボックスの有効期間をPythonの構成要素 (コンテキストマネージャー、またはプロセスの終了時にSDKが閉じるセッション) に結び付けることで、SDKが明示的な `stop()` 呼び出しなしにリソースを解放できるようにします。セッションやコンテキストマネージャーの外で `Sandbox.run()` を使用して開始したサンドボックスは、スクリプトの終了後も、メインコマンドが終了するか、ユーザーが停止するか、最大ライフタイムに達するまで実行され続けます。

<h3 id="context-managers-recommended">
  コンテキストマネージャー (推奨)
</h3>

コンテキストマネージャーは、囲まれたコードが例外を送出する場合でもクリーンアップを保証するため、推奨されるパターンです。SDK はコンテキストが終了するとサンドボックスを停止します：

```python theme={"system"}
from cwsandbox import Sandbox

with Sandbox.run() as sandbox:
    result = sandbox.exec(["echo", "hello"]).result()
# sandbox.stop() は自動的に呼び出されます
```

セッション はすべてのサンドボックスをクリーンアップします：

```python theme={"system"}
import cwsandbox
from cwsandbox import SandboxDefaults

with cwsandbox.Session(SandboxDefaults(container_image="python:3.11")) as session:
    sb1 = session.sandbox()
    sb2 = session.sandbox()
# 両方のサンドボックスは自動的に停止されます
```

<h3 id="global-cleanup-handlers">
  グローバルなクリーンアップハンドラ
</h3>

SDK は、プロセスの終了時に、登録済みのセッションが所有するサンドボックスを停止するクリーンアップハンドラを登録します。セッションやコンテキストマネージャーを使わずに作成したスタンドアロンのサンドボックスは、明示的にクリーンアップする必要があります。

| シナリオ | 動作 |
| - | - |
| スクリプトの正常終了 | `atexit` ハンドラが登録済みセッション内のサンドボックスを停止します |
| Ctrl+C (`SIGINT`) | シグナルハンドラが登録済みセッション内のサンドボックスを停止します |
| `SIGTERM` | シグナルハンドラが登録済みセッション内のサンドボックスを停止します |
| 2 回目の Ctrl+C | 強制終了します (シャットダウン時に応答しなくなるのを防ぎます) |

SDK は、コードで最初にサンドボックスを作成した時点でこれらのハンドラをインストールします。`SIGINT` と `SIGTERM` のハンドラは、Python のメインスレッドから実行された場合にのみインストールされます。アプリケーションで独自にシグナルを処理している場合は、最初のサンドボックスを作成する前に `cwsandbox.disable_signal_handlers()` を呼び出すか、`CWSANDBOX_DISABLE_SIGNAL_HANDLERS=1` を設定してください。この場合も `atexit` ハンドラは実行されますが、シグナル受信時のサンドボックスの停止はアプリケーション側で行う必要があります。

<h2 id="manual-cleanup">
  手動クリーンアップ
</h2>

サンドボックスまたはセッションをいつリリースするかを明示的に制御する必要がある場合に、手動クリーンアップを使用します。手動クリーンアップでは、停止オプションを渡したり、長時間実行されるコード全体でクリーンアップを調整したりできます。

<h3 id="sandbox-stop">
  サンドボックス stop()
</h3>

```python theme={"system"}
sandbox = Sandbox.run()
result = sandbox.exec(["echo", "hello"]).result()
sandbox.stop().result()

# オプション付き
sandbox.stop(graceful_shutdown_seconds=30.0).result()
sandbox.stop(snapshot_on_stop=True).result()
```

<h3 id="session-close">
  Session close()
</h3>

```python theme={"system"}
from cwsandbox import SandboxDefaults

session = cwsandbox.Session(SandboxDefaults(container_image="python:3.11"))
sandbox = session.sandbox()
# ...
session.close().result()  # すべてのサンドボックスを停止します
```

<h3 id="batch-cleanup">
  バッチのクリーンアップ
</h3>

```python theme={"system"}
from cwsandbox import results

sandboxes = [Sandbox.run() for _ in range(5)]
# ... サンドボックスを使用する ...
results([sb.stop() for sb in sandboxes])  # すべてを並列で停止
```

<h2 id="orphan-management">
  孤立したサンドボックス management
</h2>

孤立したサンドボックスとは、作成したプロセスの終了後も意図せず実行され続けているサンドボックスです。意図的に実行し続けているスタンドアロンのサンドボックスは孤立したサンドボックスではありませんが、その所在を把握できなくなると孤立したサンドボックスになります。以下のセクションでは、孤立したサンドボックスを検索しやすくする方法、孤立したサンドボックスをクエリする方法、および管理されたクリーンアップの下に戻す方法について説明します。

<h3 id="tagging-for-discovery">
  ディスカバリーのためのタグ付け
</h3>

セッションやコンテキストマネージャー内のサンドボックスは、SDK の自動クリーンアップによって、ほとんどの場合孤立せずに済みます。ただし、強制シャットダウン (`kill -9`) やネットワーク障害が発生した後は、これらのサンドボックスも実行され続けることがあります。また、クリーンアップハンドラはスタンドアロンのサンドボックスを停止しないため、停止し忘れると孤立したサンドボックスになります。タグ を使用して、後で孤立したサンドボックスを発見できるようにします。

```python theme={"system"}
from cwsandbox import Sandbox, SandboxDefaults

# 作成時にタグを付ける
defaults = SandboxDefaults(
    container_image="python:3.11",
    tags=("my-project", "batch-job-123"),
)

with Sandbox.run(defaults=defaults) as sandbox:
    result = sandbox.exec(["echo", "hello"]).result()
```

適切なタグ付けの方法:

* project またはアプリケーション名 (`my-project`)
* ジョブまたはrunの識別子 (`batch-job-123`, `run-2024-01-15`)
* 環境 (`dev`, `staging`, `prod`)

<h3 id="find-orphaned-sandboxes">
  孤立したサンドボックスを検索する
</h3>

タグでクエリして、以前の run からサンドボックスを検索します：

```python theme={"system"}
from cwsandbox import Sandbox

orphans = Sandbox.list(tags=["my-project"]).result()
for sandbox in orphans:
    sandbox.stop().result()
```

<h3 id="session-adoption">
  セッションの取り込み
</h3>

孤立したサンドボックス を取り込むと、それをセッションにアタッチし、セッションがその有効期間を管理します。その後、孤立したサンドボックス は新しく作成されたサンドボックスと同じ自動クリーンアップ保証を受けます。`session.list()` はセッションのデフォルトのタグをフィルターに追加するため、それらのタグが付いたサンドボックスのみが検索されます。セッションのタグを適用せずに検索するには、[Sessions ガイド](/ja/products/sandboxes/client/guides/sessions#adopt-external-sandboxes)にあるように、`Sandbox.list()` を使用して、取得した各サンドボックスを取り込みます：

```python theme={"system"}
import cwsandbox
from cwsandbox import SandboxDefaults

with cwsandbox.Session(SandboxDefaults(container_image="python:3.11")) as session:
    orphans = session.list(tags=["my-project"]).result()
    for sandbox in orphans:
        session.adopt(sandbox)
# セッションで取り込まれたすべてのサンドボックスはクリーンアップされます
```

<h3 id="delete-by-id">
  Delete by ID
</h3>

サンドボックスの ID をすでに知っている場合は、まず list したり取り込んだりせずに直接削除できます：

```python theme={"system"}
from cwsandbox import Sandbox

Sandbox.delete("sandbox-abc123").result()
Sandbox.delete("sandbox-abc123", missing_ok=True).result()  # 存在しなければ無視します
```
