3. 量子任务的生命周期管理

在量子云平台上,一个量子任务并不是“点一下运行”就结束的瞬时动作。它从用户提交电路与参数开始,经过排队、资源调度、真机或模拟器执行、状态监控、结果回收,最终被归档或清理,整个过程构成一条有明确状态边界的生命周期。理解这条生命周期,是排查“任务为什么一直排队”“结果为什么拿不到”“配额为什么被占用”等问题的前提。

本节以一台超导量子计算机的典型云平台为例,说明各阶段的状态转换与持久化机制。示例中的任务号、时间、队列深度均为教学假设值,用于说明机制,不代表真实平台实测数据。

一、生命周期状态模型

平台通常为任务定义一组互斥状态,常见包括:CREATED(已创建,尚未提交)、QUEUED(已入队等待)、RUNNING(正在执行)、COMPLETED(执行成功)、FAILED(执行失败)、CANCELLED(用户取消)、EXPIRED(结果过期被清理)。状态之间不是任意跳转,而是受事件驱动:提交事件使 CREATED→QUEUED,调度器分配资源后 QUEUED→RUNNING,执行结束根据返回码进入 COMPLETED 或 FAILED,用户主动撤销进入 CANCELLED,结果保留期到期后进入 EXPIRED。

关键约束是:COMPLETED、FAILED、CANCELLED、EXPIRED 属于终态,终态任务不再被调度器选中;但终态不等于数据立即消失,结果与元数据会按保留策略继续存在一段时间。

CREATED 已创建 QUEUED 排队等待 RUNNING 执行中 COMPLETED 执行成功 FAILED 执行失败 CANCELLED 用户取消 EXPIRED 结果过期清理 提交 调度分配 成功 失败 取消 取消 保留期到期 持久化层 任务元数据库 task_id / 状态 / 时间戳 用户 / 配额 / 优先级 结果存储 测量计数 / 概率分布 原始比特串 / 校准数据 事件日志 状态变更记录 错误码 / 重试次数 清理策略 TTL / 配额释放 归档 / 删除

二、提交阶段:参数校验与幂等入队

提交阶段的核心不是“把电路发出去”,而是完成参数校验、配额检查和幂等入队。用户通过 SDK 或 REST API 提交时,平台会校验电路深度、量子比特数、测量次数(shots)、目标后端是否可用等。若校验失败,任务不会进入 QUEUED,而是直接返回错误码,避免无效任务占用队列。

幂等性通过 client_request_id 实现:同一用户用相同请求 ID 重复提交,平台只创建一条任务记录,返回同一个 task_id。这在网络重试场景中非常关键,否则一次超时重试可能产生两个真机任务,浪费配额。

POST /api/v1/tasks
{
  "backend": "scq-sim-01",
  "circuit_qasm": "OPENQASM 2.0; ...",
  "shots": 4096,
  "priority": "normal",
  "client_request_id": "req-20240612-7f3a"
}

响应示例:
{
  "task_id": "task-9c2e41",
  "status": "QUEUED",
  "queue_position": 12,
  "estimated_wait_s": 180
}

提交成功后,任务元数据写入任务元数据库,状态置为 QUEUED,同时写入一条事件日志。此时结果存储中还没有数据,只有元数据记录。

三、排队与调度:优先级、配额与资源匹配

排队阶段的任务处于 QUEUED,调度器按策略选择下一个执行对象。常见策略包括:先入先出(FIFO)、优先级队列、公平份额(fair share)和预留时段。优先级通常由用户等级、任务类型(校准任务高于普通实验)和提交时间共同决定。

调度器需要做资源匹配:目标后端是否有空闲量子比特、是否需要校准、当前是否处于维护窗口。若后端不可用,任务可能被重新排队而不是直接失败。调度成功后,任务状态从 QUEUED 变为 RUNNING,并记录 started_at 时间戳。

持久化方面,队列本身可以是内存中的优先队列,但队列位置和调度决策必须落库,否则平台重启后无法恢复。通常做法是:任务元数据持久化,队列状态通过元数据中的 status 和 priority 重建。

四、执行与监控:心跳、超时与状态回写

执行阶段由后端控制器负责。控制器将任务下发到量子控制硬件,采集测量结果,并在执行过程中定期回写心跳。监控系统关注三类信号:任务是否仍在运行、是否超时、是否产生错误码。

若执行时间超过预设阈值(例如 300 秒),平台可将任务标记为 FAILED,错误码为 TIMEOUT。若硬件返回校准漂移或读取错误,则记录具体错误码,便于后续排障。执行成功后,结果写入结果存储,任务状态变为 COMPLETED,并记录 finished_at。

监控不是“看一个进度条”。真正需要持久化的是状态变更事件:谁在什么时间把任务从 RUNNING 改为 COMPLETED,依据是什么。这些事件日志是后续审计和复现的关键。

五、结果回收与清理:TTL、配额释放与归档

结果回收阶段,用户通过 task_id 查询结果。平台从结果存储读取测量计数、概率分布和原始比特串,返回给用户。此时任务已处于终态,但结果不会永久保留。平台通常设置 TTL(例如 30 天),到期后结果被删除或归档,任务状态变为 EXPIRED。

清理阶段还需要释放配额。若配额按“运行中任务数”计算,任务进入终态时就应释放;若按“结果存储量”计算,则清理结果时才释放。两种口径必须在平台文档中明确,否则用户会困惑“任务已经完成,为什么配额还没回来”。

阶段 状态 关键持久化对象 典型触发条件
提交 CREATED → QUEUED 任务元数据、幂等键 参数校验通过、配额充足
排队 QUEUED 队列位置、优先级 调度器未选中
调度 QUEUED → RUNNING started_at、后端绑定 资源匹配成功
执行 RUNNING 心跳、错误码 控制器下发并采集
结果回收 COMPLETED / FAILED 结果存储、finished_at 执行结束
清理 EXPIRED TTL 记录、归档索引 保留期到期

六、实践中的状态一致性

生命周期管理最容易出问题的地方是状态不一致:元数据库显示 RUNNING,但控制器已经结束;或者结果已写入,但状态还没更新。解决思路是让状态变更走同一条事件通道,并保证“先写结果、再改状态”或“先改状态、再写结果”的顺序在平台内统一。若采用最终一致性,则需要监控对账任务,定期扫描长时间处于 RUNNING 的任务并修正。

对使用者而言,最实用的做法是:提交后保存 task_id,轮询或订阅状态变更,拿到终态后再取结果;不要假设提交成功就等于执行成功,也不要在结果过期后才去下载。理解这条生命周期,就能在量子云平台上更稳定地编排和执行任务。