提交与等待
突发:一次 submit 多张。queueCapacity 必须 ≥ 突发量,或 overflow=BLOCK。流式:每毫秒一张。GPU 若 5ms/张,队列会积压——必须选 overflow。
队列满时:
FAIL— submit 立即失败,码 19(DARRA_BUSY)BLOCK— submit 等到有空位DROP_OLDEST— 丢掉最旧未开跑任务;被挤掉的票waitFor得码 19
码 19 的 Java 形态见 错误处理。
图像字节会被拷走,调用方可立即释放入参。可多线程 submit。close() 禁止与 submit / waitFor 并发。
方法
submit(byte[] imageBytes, ImageDesc desc)
public long submit(byte[] imageBytes, ImageDesc desc)
提交一张图。返回 ticket(按无符号 64 位解释)。ticket == 0 抛 InternalException。
参数:
imageBytes(byte[]) — AUTO/ENCODED = 编码文件字节;裸缓冲 = 像素内存。null =InternalExceptiondesc(ImageDesc) — 图像描述。null =InternalException
返回值:
long— ticket,交给waitFor/tryWait
示例:
long ticket = pool.submit(jpg, ImageDesc.auto());
submitAsync(byte[] imageBytes, ImageDesc desc)
public CompletableFuture<String> submitAsync(byte[] imageBytes, ImageDesc desc)
异步糖:submit + waitFor。图像会被拷走。失败以 AiException 完成。
参数:
imageBytes(byte[]) — 图像字节desc(ImageDesc) — 图像描述
返回值:
CompletableFuture<String>— 结果 JSON 的 future
示例:
String json = pool.submitAsync(jpg, ImageDesc.auto()).join();
waitFor(long ticket)
public String waitFor(long ticket)
等待结果 JSON。对齐 C darra_pool_wait。被 InferOverflow.DROP_OLDEST 挤掉的票抛码 19。
参数:
ticket(long) —submit返回值
返回值:
String— 结果 JSON。Java 侧拷贝,无需释放
示例:
long ticket = pool.submit(jpg, ImageDesc.auto());
String json = pool.waitFor(ticket);
tryWait(long ticket)
public String tryWait(long ticket)
非阻塞。还没好抛码 19(message 说明仍在队列 / 推理)。
参数:
ticket(long) —submit返回值
返回值:
String— 结果 JSON
示例:
try {
String json = pool.tryWait(ticket);
} catch (AiException ex) {
if (ex.getCode() == 19) {
return;
}
throw ex;
}
close()
@Override
public void close()
关闭池:拒新任务、等在飞 Infer 结束、关全部会话。NULL / 重复关闭安全。禁止与 submit / waitFor 并发。
示例:
try (AiInferPool pool = AiInferPool.openPlain("model.onnx", null, null)) {
long t = pool.submit(jpg, ImageDesc.auto());
String json = pool.waitFor(t);
}
完整示例
import xyz.darra.ai.*;
InferPoolOptions opt = InferPoolOptions.empty()
.maxWorkers(2)
.queueCapacity(128)
.overflow(InferOverflow.DROP_OLDEST)
.worker(SessionOptions.empty().gpuDevice(0))
.weight(100);
GpuScheduler.setGpuSlots(0, 4);
try (AiInferPool pool = AiInferPool.openPlain("yolov8n.onnx", "onnx-cuda", opt)) {
long ticket = pool.submit(frame, ImageDesc.bgr888(1920, 1080));
String json = pool.waitFor(ticket);
} catch (AiException ex) {
if (ex.getCode() == 19) {
System.err.println(ex.getHint());
return;
}
System.err.println("[" + ex.getCode() + "] " + ex.getMessage());
System.err.println("建议: " + ex.getHint());
}