{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "810fe365-8557-46b0-97e7-324b08a1c6e2",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"ジョブの監視またはキャンセル\"\n",
        "description: \"IBM Quantum Platform に送信されたジョブを監視またはキャンセルする方法\"\n",
        "---\n",
        "\n",
        "<span id=\"monitor-or-cancel-a-job\" />\n",
        "\n",
        "# ジョブの監視またはキャンセル\n",
        "\n",
        "このガイドでは、ジョブのステータスを確認する方法、使用状況情報を表示する方法、およびジョブをキャンセルする方法について説明します。 この情報には、 IBM Quantum® Platform からアクセスできるほか、Qiskit を使用してプログラムからアクセスすることも可能です。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "866ed6ab-a597-402e-876a-8315ac5ed9e6",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bb84ab8e-6db9-45d6-bb59-2f06f38d9965",
      "metadata": {},
      "source": [
        "{/*\n",
        "  DO NOT EDIT THIS CELL!!!\n",
        "  This cell's content is generated automatically by a script. Anything you add\n",
        "  here will be removed next time the notebook is run. To add new content, create\n",
        "  a new cell before or after this one.\n",
        "  */}\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"パッケージ・バージョン\">\n",
        "    このページのコードは、以下の要件に基づいて開発されました。\n",
        "    これらのバージョン、またはそれ以降のバージョンの使用をお勧めします。\n",
        "\n",
        "    ```\n",
        "    qiskit-ibm-runtime~=0.46.1\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "view-status",
      "metadata": {},
      "source": [
        "<span id=\"monitor-a-job\" />\n",
        "\n",
        "## ジョブを監視する\n",
        "\n",
        "これらのメソッドを使用して、送信済みのジョブのステータスを確認したり、結果を取得したり、ジョブおよびその実行に関する詳細を表示したりできます。\n",
        "\n",
        "<Tabs>\n",
        "  <TabItem value=\"Qiskit\" label=\"Monitor a job with Qiskit\">\n",
        "    このジョブインスタンスには、監視を行うためのいくつかのメソッドが用意されています：\n",
        "\n",
        "    | メソッド                         | 説明                             |\n",
        "    | ---------------------------- | ------------------------------ |\n",
        "    | `job.status()`               | 現在のジョブのステータスを確認する              |\n",
        "    | `job.job_id()`               | 一意のジョブ識別子を取得する                 |\n",
        "    | `job.result()`               | ジョブの結果を取得する（完了するまで呼び出しをブロックする） |\n",
        "    | `job.wait_for_final_state()` | ジョブが終了状態に達するまでブロックする           |\n",
        "\n",
        "    <CodeCellPlaceholder tag=\"id-status\" />\n",
        "  </TabItem>\n",
        "\n",
        "  <TabItem value=\"IQP\" label=\"Monitor a job on IBM Quantum Platform\">\n",
        "    [「ワークロード」ページ](/workloads)に移動し、「ステータス」列を確認してください。 雇用状況は、以下のいずれかとして表示されます：\n",
        "\n",
        "    * **保留中** ：ジョブがQPUでの実行を待機しています\n",
        "    * **処理中** ：ジョブが現在実行されています\n",
        "    * **完了** ：作業が正常に終了しました\n",
        "    * **失敗** ：ジョブでエラーが発生しました\n",
        "    * **キャンセル** ：ユーザーがジョブをキャンセルしました\n",
        "\n",
        "    ジョブ名または行をクリックすると、詳細ビューが開き、結果やエラーメッセージなどの情報を確認できます。\n",
        "  </TabItem>\n",
        "</Tabs>\n",
        "\n",
        "<span id=\"why-a-job-stays-in-progress\" />\n",
        "\n",
        "### なぜ仕事のステータスが「進行中」のままになるのか\n",
        "\n",
        "（ジョブモードまたはバッチモードのいずれかを使用して）数秒で完了するはずのジョブが、「処理中」（Qiskit `RUNNING` では 「**In progress** 」と呼ばれます）の状態に、予想よりもずっと長く留まっていることに気づくかもしれません。 これは正常な現象であり、その時間すべてがジョブの処理に費やされていることを意味するわけではありません。 これは、QPUへのジョブのスケジューリング方法に起因しています：\n",
        "\n",
        "* どのジョブも、QPU上で実行するには、まず標準的な前処理を行う必要があります。 この通常の処理が開始されるとすぐに、ジョブは 「**処理中** (`RUNNING`)」の状態に移行します。QPU上での実行が開始された時点ではありません。\n",
        "* この従来の処理のほとんどは並列で実行されるため、複数のジョブを同時に**進行**させることができます。\n",
        "* ただし、QPUでは一度に1つのジョブしか実行できません。 複数のジョブが通常の処理を完了し、実行可能な状態になった場合、それらのジョブはQPUの使用順番を待たなければなりません。 これは「 *QPU競合*」 として知られています。 競合が激しい場合、ジョブは、実際に必要なQPU時間である数秒よりも、著しく長い時間 **「処理中」の状態**が続くことがあります。\n",
        "* また、QPU上でキャリブレーションなどのシステムメンテナンスタスクが実行されている場合にも、競合が発生する可能性があります。 メンテナンスタスクが完了し、QPUが利用可能になるまで、ジョブは **「処理中」の**状態のままとなります。\n",
        "\n",
        "このため、ジョブが **「進行中」の状態**にある間に経過した実時間は、そのジョブの使用時間とは一致しません。 [推定](/docs/guides/estimate-job-run-time)使用時間と[最大実行](/docs/guides/max-execution-time)時間の両方は、ジョブの実行のためにQPUがロックされる時間のみに基づいており、したがって、前述のマルチスレッドによる従来の処理は含まれていません。 **「進行中」** の状態が長く続いても、報告される使用量や費用は増加しません。\n",
        "\n",
        "<span id=\"session-mode-is-different\" />\n",
        "\n",
        "#### セッションモードが異なります\n",
        "\n",
        "上記の動作は、 [ジョブモード](/docs/guides/execution-modes#job-mode)および[バッチモード](/docs/guides/execution-modes#batch-mode)に適用されます。 [セッションモード](/docs/guides/execution-modes#session-mode)では、セッションのアクティブウィンドウが開いている間、ユーザーはバックエンドへの排他的なアクセス権を持ち、キャリブレーションジョブを含め、他のジョブは一切実行できません。 したがって、QPUの競合が発生するのは、自身のセッション内のジョブ間でのみです。 また、QPUの容量はセッションの期間中確保されるため、セッションの使用状況は、ジョブが実際に実行されているかどうかにかかわらず、セッションがアクティブな状態にある間の経過時間として測定されます。 詳細については、「 [ワークロードの使用状況](/docs/guides/estimate-job-run-time#usage)」 を参照してください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "ee0318b6-0bfd-4f0b-b980-4e233a2d5d7b",
      "metadata": {
        "tags": [
          "id-status"
        ]
      },
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Retrieve a job by ID\n",
        "job = service.job(\"<job_id>\")\n",
        "\n",
        "# Get job ID (useful for saving for later retrieval)\n",
        "print(f\"Job ID: {job.job_id()}\")\n",
        "\n",
        "# Check current status\n",
        "print(f\"Status: {job.status()}\")\n",
        "\n",
        "# Wait for job to complete (blocking call)\n",
        "job.wait_for_final_state()\n",
        "print(\"Job completed\")\n",
        "\n",
        "# Get results\n",
        "results = job.result()\n",
        "print(results)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "view-usage",
      "metadata": {},
      "source": [
        "<span id=\"view-remaining-usage\" />\n",
        "\n",
        "## 残りの使用量を確認する\n",
        "\n",
        "プランの利用枠の残量を把握しましょう。\n",
        "\n",
        "<Tabs>\n",
        "  <TabItem value=\"Qiskit\" label=\"Check usage with Qiskit\">\n",
        "    この `service.usage()` メソッドを使用して、現在アクティブなインスタンスの使用状況情報を取得します。\n",
        "\n",
        "    <CodeCellPlaceholder tag=\"id-usage\" />\n",
        "  </TabItem>\n",
        "\n",
        "  <TabItem value=\"IQP\" label=\"View usage on IBM Quantum Platform\">\n",
        "    [「インスタンス」ページ](/instances)に移動し、確認したいプランに対応するタブを選択してください。 プランの利用済み合計時間と残り合計時間が表示されます。\n",
        "  </TabItem>\n",
        "</Tabs>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "usage-code",
      "metadata": {
        "tags": [
          "id-usage"
        ]
      },
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Get usage information for the current active instance\n",
        "usage = service.usage()\n",
        "print(usage)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "view-metrics",
      "metadata": {},
      "source": [
        "<span id=\"view-job-metrics\" />\n",
        "\n",
        "## 求人指標を表示する\n",
        "\n",
        "バッチやセッションのワークロード指標を含め、ジョブの送信状況の概要を確認できます。\n",
        "\n",
        "<Tabs>\n",
        "  <TabItem value=\"Qiskit\" label=\"Get job metrics with Qiskit\">\n",
        "    \\`\\` メソッド [`service.jobs()`](/docs/api/qiskit-ibm-runtime/qiskit-runtime-service#jobs) とフィルターを組み合わせて使用すると、送信済みのジョブに関する情報（送信された件数、ステータス、作成日時など）を取得できます。 次の例では、過去7日間に送信されたすべてのジョブを取得し、それらのジョブによる総使用量を計算します。\n",
        "\n",
        "    <CodeCellPlaceholder tag=\"id-metrics\" />\n",
        "  </TabItem>\n",
        "\n",
        "  <TabItem value=\"IQP\" label=\"View job metrics on IBM Quantum Platform\">\n",
        "    「 [アナリティクス」ページ](/analytics)に移動すると、次のようなデータを表示・ダウンロードできます：\n",
        "\n",
        "    * 合計使用量\n",
        "    * インスタンス、量子コンピュータ、およびユーザーごとにフィルタリングされた使用状況\n",
        "    * ジョブ、バッチ、およびセッションのワークロード数の集計\n",
        "\n",
        "    **注** ：アナリティクスページにアクセスできるのは、ご自身が所有または管理しているアカウントのみです。\n",
        "  </TabItem>\n",
        "</Tabs>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "metrics-code",
      "metadata": {
        "tags": [
          "id-metrics"
        ]
      },
      "outputs": [],
      "source": [
        "from datetime import datetime, timedelta\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Retrieve all jobs in the last 7 days\n",
        "seven_days_ago = datetime.now() - timedelta(days=7)\n",
        "jobs = service.jobs(limit=None, created_after=seven_days_ago)\n",
        "\n",
        "# To retrieve all jobs in a Session or Batch, use the session_id filter\n",
        "# jobs = service.jobs(session_id=\"<session id>\")\n",
        "\n",
        "total_usage = 0\n",
        "for job in jobs:\n",
        "    total_usage += job.usage()\n",
        "\n",
        "print(f\"{len(jobs)} jobs were submitted in the last 7 days.\")\n",
        "print(f\"Total usage was {total_usage} seconds\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "retrieve-later",
      "metadata": {},
      "source": [
        "<span id=\"retrieve-job-results-at-a-later-time\" />\n",
        "\n",
        "## 後でジョブの結果を取得する\n",
        "\n",
        "ジョブIDを保存しておけば、セッションを終了した後でも、後で結果を取得することができます。\n",
        "\n",
        "<Tabs>\n",
        "  <TabItem value=\"Qiskit\" label=\"Retrieve results with Qiskit\">\n",
        "    ジョブを送信した際にジョブIDを保存しておいた場合は、後でそれを取得 `service.job(<job_id>)` するには を使用してください。 ジョブIDがわからない場合や、複数のジョブを一度に取得したい場合（使用停止となったQPUのジョブを含む）は、 `service.jobs()` 代わりに を使用し、必要に応じてフィルタを指定してください。\n",
        "\n",
        "    利用可能なフィルターについては、API [`QiskitRuntimeService.jobs`](/docs/api/qiskit-ibm-runtime/qiskit-runtime-service#jobs) ドキュメントを参照してください。\n",
        "\n",
        "    この例では、特定のバックエンドで実行された直近の結果を取得する方法を示しています。\n",
        "\n",
        "    <CodeCellPlaceholder tag=\"id-retrieve\" />\n",
        "  </TabItem>\n",
        "\n",
        "  <TabItem value=\"IQP\" label=\"Retrieve results on IBM Quantum Platform\">\n",
        "    1. [「ワークロード」ページ](/workloads)に移動します。\n",
        "    2. 検索機能やフィルタ機能を使って、求人名、日付、またはステータスから求人を探してください。\n",
        "    3. ジョブをクリックすると、その結果と詳細が表示されます。\n",
        "  </TabItem>\n",
        "</Tabs>\n",
        "\n",
        "<span id=\"retrieve-backend-properties\" />\n",
        "\n",
        "## バックエンドのプロパティを取得する\n",
        "\n",
        "<Tabs>\n",
        "  <TabItem value=\"Qiskit\" label=\"Retrieve backend properties with Qiskit\">\n",
        "    を使用 `job.properties()` すると、ジョブ実行時のエラー率など、バックエンドのプロパティを取得できます。\n",
        "\n",
        "    この例では、ジョブの実行時点で有効だったバックエンドのプロパティを取得する方法を示しています。これには、 $T_1$ / $T_2$ の実行時間や、特定の量子ビット（0）のエラー率などが含まれます。\n",
        "\n",
        "    <CodeCellPlaceholder tag=\"id-backend-properties\" />\n",
        "\n",
        "    <Admonition type=\"note\" title=\"非推奨プロバイダ・パッケージ\">\n",
        "      `service.jobs()` 非推奨の `qiskit-ibm-provider` パッケージから実行されたジョブも返します。 古い（同じく非推奨の） `qiskit-ibmq-provider` パッケージによって提出されたジョブは、もはや利用できません。\n",
        "    </Admonition>\n",
        "  </TabItem>\n",
        "\n",
        "  <TabItem value=\"IQP\" label=\"Retrieve backend properties on IBM Quantum Platform\">\n",
        "    ジョブの実行時だけでなく、ジョブの作成時にも、バックエンドのキャリブレーションデータを確認できます。\n",
        "\n",
        "    1. [「ワークロード」ページ](/workloads)に移動する\n",
        "    2. ワークロードをクリックして、その詳細ページを開きます\n",
        "    3. 「量子コンピュータ」の下にある「キャリブレーション履歴を表示」をクリックします\n",
        "    4. ドロップダウンメニューを使用して、データの表示対象を「ジョブ実行開始時」から「ジョブ作成時」に変更してください\n",
        "  </TabItem>\n",
        "</Tabs>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "retrieve-code",
      "metadata": {
        "tags": [
          "id-retrieve"
        ]
      },
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Uncomment the next line to retrieve a specific job by ID\n",
        "# job = service.job(\"<job_id>\")\n",
        "\n",
        "# Optionally retrieve multiple jobs with filters\n",
        "# Use `limit` to retrieve a specific number of jobs. The default `limit` is 10.\n",
        "my_backend = \"<your-backend>\"\n",
        "recent_jobs = service.jobs(backend_name=my_backend, limit=10)\n",
        "\n",
        "print(f\"Retrieved {len(recent_jobs)} recent jobs from {my_backend}\\n\")\n",
        "\n",
        "# Get results from all jobs\n",
        "for job in recent_jobs:\n",
        "    print(f\"Job ID: {job.job_id()}\")\n",
        "    print(f\"Status: {job.status()}\")\n",
        "\n",
        "    # Retrieve results if the job is complete\n",
        "    if str(job.status()) == \"DONE\":\n",
        "        try:\n",
        "            results = job.result()\n",
        "            print(f\"Results: {results}\")\n",
        "        except Exception as e:\n",
        "            print(f\"Error retrieving results: {e}\")\n",
        "    else:\n",
        "        print(\"Results: Not available (job still running or failed)\")\n",
        "    print()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "55afa300-0af7-4f5e-8b32-c32b6ba39621",
      "metadata": {
        "tags": [
          "id-backend-properties"
        ]
      },
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Retrieve a specific job by ID\n",
        "job = service.job(\"<job_id>\")\n",
        "\n",
        "print(f\"Job ID: {job.job_id()}\")\n",
        "print(f\"Backend: {job.backend}\\n\")\n",
        "\n",
        "# Fetch backend properties at the time of job execution\n",
        "properties = job.properties()\n",
        "\n",
        "if properties:\n",
        "    print(\"Backend Properties at Job Execution Time:\")\n",
        "    print(\"=\" * 60)\n",
        "\n",
        "    # Get T1 (relaxation time) for qubit 0\n",
        "    t1 = properties.t1(0)\n",
        "    print(f\"Qubit 0 T1 (relaxation time): {t1}\")\n",
        "\n",
        "    # Get T2 (dephasing time) for qubit 0\n",
        "    t2 = properties.t2(0)\n",
        "    print(f\"Qubit 0 T2 (dephasing time): {t2}\")\n",
        "\n",
        "    # Get readout error for qubit 0\n",
        "    readout_error = properties.readout_error(0)\n",
        "    print(f\"Qubit 0 readout error: {readout_error}\")\n",
        "\n",
        "    # Get all properties for a specific qubit\n",
        "    print(\"All properties for qubit 0:\")\n",
        "    qubit_props = properties.qubit_property(0)\n",
        "    for prop_name, prop_value in qubit_props.items():\n",
        "        print(f\"  {prop_name}: {prop_value}\")\n",
        "else:\n",
        "    print(\"No properties available for this job\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "cancel-job",
      "metadata": {},
      "source": [
        "<span id=\"cancel-a-job\" />\n",
        "\n",
        "## ジョブをキャンセルします\n",
        "\n",
        "キューに登録されている、または実行中のジョブをキャンセルします。 一度キャンセルされたジョブは、再開することはできません。\n",
        "\n",
        "<Tabs>\n",
        "  <TabItem value=\"Qiskit\" label=\"Cancel with Qiskit\">\n",
        "    この `job.cancel()` メソッドを使用して、プログラムからジョブをキャンセルします。\n",
        "\n",
        "    <CodeCellPlaceholder tag=\"id-cancel\" />\n",
        "  </TabItem>\n",
        "\n",
        "  <TabItem value=\"IQP\" label=\"Cancel on IBM Quantum Platform\">\n",
        "    1. 「**ワークロード** 」テーブルから：キャンセルしたいワークロードの行末にあるオーバーフローメニューをクリックし、「 **キャンセル**」 を選択します。\n",
        "    2. **ジョブの詳細ページから** ：ワークロードをクリックして詳細ページを開き、上部の「 **アクション** 」ドロップダウンメニューから「 **キャンセル** 」を選択します。\n",
        "  </TabItem>\n",
        "</Tabs>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "cancel-code",
      "metadata": {
        "tags": [
          "id-cancel"
        ]
      },
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Retrieve the job\n",
        "job = service.job(\"<job_id>\")\n",
        "\n",
        "# Cancel the job\n",
        "job.cancel()\n",
        "\n",
        "print(f\"Job {job.job_id()} has been canceled\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "next-steps",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * その他のジョブ管理メソッドについては、 [API `QiskitRuntimeService` リファレンス](/docs/api/qiskit-ibm-runtime/qiskit-runtime-service)を参照してください。\n",
        "  * [実行モードについて](/docs/guides/execution-modes)詳しく見て、バッチ型およびセッション型のワークロードの種類を理解しましょう。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "description": "How to monitor or cancel a job submitted to IBM Quantum Platform",
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    },
    "title": "Monitor or cancel a job"
  },
  "nbformat": 4,
  "nbformat_minor": 4
}