跳到主要内容

API

提交与等待。打开见 构造ImageDesc类型。BUSY 见 错误

提交与等待

submit()

pub fn submit(&self, image: &[u8], desc: &ImageDesc) -> Result<u64, Error>

提交一张图。返回 ticket。图像会被拷走,切片可在返回后立即释放。永不收激活码。可多线程 submit

InferOverflow::Fail 且队列满 → DARRA_BUSY(19)。Block 则等到有空位。DropOldest 丢掉最旧未开跑任务,被挤掉的票在 wait 上得 BUSY。

参数:

返回值:

  • Result<u64, Error> — 成功时 ticket > 0

示例:

let ticket = pool.submit(&jpeg, &ImageDesc::auto())?;

wait()

pub fn wait(&self, ticket: u64) -> Result<String, Error>

等待结果 JSON。被 DROP_OLDEST 挤掉的票返回 DARRA_BUSY

参数:

  • ticket (u64) — submit 返回的票

返回值:

  • Result<String, Error> — 结果 JSON。绑定把 Core 堆字符串收成 String

示例:

let json = pool.wait(ticket)?;

try_wait()

pub fn try_wait(&self, ticket: u64) -> Result<String, Error>

非阻塞。还没好返回 DARRA_BUSY(message 说明仍在队列 / 推理)。Core 没好时不写 json。

参数:

  • ticket (u64) — submit 返回的票

返回值:

  • Result<String, Error> — 已完成则 JSON;未完成 / 被挤掉则 BUSY

示例:

match pool.try_wait(ticket) {
Ok(json) => handle(&json),
Err(e) if e.code() == 19 => { /* 还在队列或推理 */ }
Err(e) => return Err(e),
}

wait_json()

#[cfg(feature = "json")]
pub fn wait_json(&self, ticket: u64) -> Result<serde_json::Value, Error>

wait,feature json 下解析为 serde_json::Value

参数:

  • ticket (u64) — 票

返回值:

  • Result<serde_json::Value, Error> — 解析后的结果 JSON

try_wait_json()

#[cfg(feature = "json")]
pub fn try_wait_json(&self, ticket: u64) -> Result<serde_json::Value, Error>

try_wait,feature json 下解析为 serde_json::Value

参数:

  • ticket (u64) — 票

返回值:

  • Result<serde_json::Value, Error> — 已完成则 JSON;未完成则 BUSY

调度

set_gpu_slots()

pub fn set_gpu_slots(gpu_device: i32, slots: i32)

同一 GPU 同时 InferImage 上限(张)。slots = 0(默认)不限制。gpu_device 对应 worker 的 GPU 序号(0 = 第一块卡)。这不是 CUDA SM 占用百分比,是并发推理槽。无句柄、不失败、线程安全。crate 根:darra_ai::set_gpu_slots

参数:

  • gpu_device (i32) — GPU 序号
  • slots (i32) — 并发槽;0 = 不限制

示例:

darra_ai::set_gpu_slots(0, 2);

释放

Drop

InferPool 离开作用域时调用 darra_pool_close:拒新任务、等在飞 Infer 结束、关全部会话。NULL 安全。禁止与 submit / wait 并发。InferPool 不可 CloneSend + Sync

示例:

{
let pool = InferPool::open("model.darmodel", None, None)?;
let ticket = pool.submit(&jpeg, &ImageDesc::auto())?;
let _ = pool.wait(ticket)?;
} // 此处 Drop → close