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。
参数:
image(&[u8]) — 同Session::infer_imagedesc(&ImageDesc) — 绑定自动填 FFIsize
返回值:
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 不可 Clone。Send + Sync。
示例:
{
let pool = InferPool::open("model.darmodel", None, None)?;
let ticket = pool.submit(&jpeg, &ImageDesc::auto())?;
let _ = pool.wait(ticket)?;
} // 此处 Drop → close