You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现多个Google MLKit TextRecognition进程并行运行?

解决MLKit TextRecognition多任务并行执行问题

问题原因

你当前的实现里,所有任务共享同一个TextRecognizer实例——MLKit的单个TextRecognizer内部会串行处理所有传入的process请求,哪怕你指定了多线程Executor,也只是用来执行单个任务的内部子操作,无法让多个识别任务并行运行。从日志能明显看到,四个任务的完成时间依次延迟,耗时累加,完全是串行执行的表现。

解决方案

为每个识别任务创建独立的TextRecognizer实例,每个实例可以独立处理请求,实现真正的并行。同时要注意在任务完成后关闭实例,避免内存泄漏。

修改后的代码示例

private Executor mExecutor = Executors.newFixedThreadPool(4);

private void testTextRec() {
    new Thread(new RecRunnable("task 1")).start();
    new Thread(new RecRunnable("task 2")).start();
    new Thread(new RecRunnable("task 3")).start();
    new Thread(new RecRunnable("task 4")).start();
}

private class RecRunnable implements Runnable {
    private final String name;
    private RecRunnable(String name) {
        this.name = name;
    }
    @Override
    public void run() {
        // 每个任务创建独立的TextRecognizer实例
        TextRecognizerOptions options = new TextRecognizerOptions.Builder()
                .setExecutor(mExecutor)
                .build();
        TextRecognizer client = TextRecognition.getClient(options);

        Bitmap bitmap = readFromAsset("huchuan_passport.jpg");
        InputImage inputImage = InputImage.fromBitmap(bitmap, 0);
        final long start = System.currentTimeMillis();
        Log.e(TAG, "start " + name + " at :" + start);
        
        client.process(inputImage)
              .addOnSuccessListener(text -> {
                  long elapse = System.currentTimeMillis() - start;
                  Log.e(TAG, name + " elapses: " + elapse + "ms");
                  // 任务完成后关闭Recognizer释放资源
                  client.close();
              })
              .addOnFailureListener(e -> {
                  // 失败场景也要关闭实例
                  client.close();
                  e.printStackTrace();
              });
    }

    private Bitmap readFromAsset(String fileName) {
        try {
            InputStream open = getAssets().open(fileName);
            return BitmapFactory.decodeStream(open);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

额外说明

  • 若任务量较大,建议用线程池统一管理任务,避免创建过多线程;也可以考虑复用TextRecognizer实例,但要保证每个实例同一时间只处理一个任务。
  • 你的设备有8个处理器,但MLKit文本识别属于CPU密集型操作,4个并行任务已经能充分利用CPU资源,无需过度增加并行数,避免资源竞争反而降低效率。

内容的提问来源于stack exchange,提问作者wu jushan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:55:36