跳到主要内容

图片队列

采集线程把图放进队列,推理线程取出后 InferImage。会话在推理侧只开一次。

没有「一次传入整个队列」的 API。队列是调用方的,SDK 每次仍是一张图。

完整示例

using System.Threading.Channels;
using Darra.AI.Runtime;

var channel = Channel.CreateBounded<byte[]>(new BoundedChannelOptions(32)
{
FullMode = BoundedChannelFullMode.Wait,
});

AiRuntime.Ensure("cpu-only");
using var session = AiSession.Open("inspect.darmodel", keyPath: "inspect.darmkey");

var producer = Task.Run(async () =>
{
foreach (string path in Directory.EnumerateFiles(@"D:\inbox", "*.jpg"))
{
await channel.Writer.WriteAsync(File.ReadAllBytes(path));
}
channel.Writer.Complete();
});

var consumer = Task.Run(async () =>
{
await foreach (byte[] jpg in channel.Reader.ReadAllAsync())
{
string json = session.InferImage(jpg, ImageDesc.Auto());
HandleResult(json);
}
});

await Task.WhenAll(producer, consumer);

有界队列容量 32 是示例,不是 SDK 上限。积压多少由现场内存决定。

要点

  • 生产者不要调用 SDK。
  • 消费者持有会话;Disposeconsumer 结束。
  • 多消费者见 并行推理