Flutter孤立线程池管理插件isolate_easy_pool的使用

Flutter孤立线程池管理插件isolate_easy_pool的使用

Dart 是一种单线程语言,支持异步编程。但如果长时间的操作在主线程上执行,将不可避免地影响系统性能。Dart 的主线程适合处理较短的异步任务,而对于长时间运行的任务,直接在主线程中执行可能会导致阻塞和性能瓶颈。然而,Dart 本身也支持多线程编程,隔离(Isolation)作为一种类似于线程的概念,提供了多任务并行处理的能力。不过,它的使用相对复杂,并且创建和销毁隔离的过程繁琐,这可能会影响性能。

为了解决这个问题,该插件封装了一个基于隔离的高效线程池,其中包括可配置的核心线程数和任务等待队列。进入线程池后,任务会首先尝试从空闲线程中获取并执行。如果所有核心线程都忙,则新任务会被添加到等待队列中。这种设计有效地减少了由于频繁创建和销毁隔离而造成的性能开销,确保了系统的效率和响应性。使用插件非常简单,在集成之后只需要几个简单的配置步骤就可以快速实现任务并行处理。

使用

更新你的 pubspec.yaml 文件并添加 isolate_easy_pool 依赖:

dependencies:
  isolate_easy_pool: ^0.0.8

初始化 SDK,建议尽早进行初始化:

IsolatePool.getInstance().init();

通过调用 ThreadPool 中的 runTask 方法,可以仅用一行代码执行异步任务:

void startExecuteIsolatePoolTask(int i) async {
  // 运行一个简单的异步任务
  String data = await IsolatePool.getInstance().runTask(() async {
    // 子线程任务
    await Future.delayed(const Duration(seconds: 10)); // 模拟异步任务
    // 将信息返回给主线程
    return "Task completed!";
  });
  // 主线程
  print("received====The $i task has been completed=${Isolate.current.debugName}");
}

确认不再需要线程池时,可以调用此方法销毁:

IsolatePool.getInstance().dispose();

完整示例Demo

以下是完整的示例代码,演示如何使用 isolate_easy_pool 插件:

import 'dart:isolate';

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:isolate_easy_pool/isolate_easy_pool.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String message = "start isolate pool";

  [@override](/user/override)
  void initState() {
    super.initState();
    initSDK();
  }

  void initSDK() {
    // 第一个参数是线程池线程数, 建议根据实际情况选择合适的Isolate数量(如CPU核心数,异步类型(CPU密集型、IO))等,默认4个Isolate
    // 第二个参数是否开启debug日志,默认不开启,建议debug模式开始,release模式关闭
    IsolatePool.getInstance().init(4, true);
  }

  void startExecuteIsolatePoolTask(int i) async {
    // 运行一个简单的异步任务
    String data = await IsolatePool.getInstance().runTask(() async {
      // 子线程任务
      await Future.delayed(const Duration(seconds: 10)); // 模拟异步任务
      // 将信息返回给主线程
      return "Task completed!";
    });
    // 主线程
    print(
        "received====The $i task has been completed=${Isolate.current.debugName}=data=$data");
    setState(() {
      message = data;
    });
  }

  void destroyIsolatePool() async {
    IsolatePool.getInstance().dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Column(
          children: [
            ElevatedButton(
              child: Text(message),
              onPressed: () {
                print("开始同时执行10个任务, ${DateTime.now()}");
                for (int i = 0; i < 10; i++) {
                  startExecuteIsolatePoolTask(i);
                }
              },
            ),
            ElevatedButton(
              child: Text('destroy isolate pool'),
              onPressed: () {
                print("destroy isolate pool");
                destroyIsolatePool();
              },
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter孤立线程池管理插件isolate_easy_pool的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter孤立线程池管理插件isolate_easy_pool的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


isolate_easy_pool 是一个用于在 Flutter 中管理 Isolate 线程池的插件。它提供了一种简单的方式来创建和管理多个 Isolate,以便在后台执行耗时任务,而不会阻塞主线程。以下是如何使用 isolate_easy_pool 的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 isolate_easy_pool 依赖:

dependencies:
  flutter:
    sdk: flutter
  isolate_easy_pool: ^1.0.0  # 请确保使用最新版本

然后在终端运行 flutter pub get 来安装依赖。

2. 导入包

在你的 Dart 文件中导入 isolate_easy_pool

import 'package:isolate_easy_pool/isolate_easy_pool.dart';

3. 创建 Isolate 池

使用 IsolateEasyPool 创建一个 Isolate 池:

final isolatePool = IsolateEasyPool(poolSize: 4); // 可以指定池的大小,例如 4 个 Isolate

4. 提交任务到 Isolate 池

你可以将任务提交到 Isolate 池中执行。每个任务将在一个 Isolate 中运行:

void main() async {
  // 创建一个 Isolate 池
  final isolatePool = IsolateEasyPool(poolSize: 4);

  // 提交任务到 Isolate 池
  final result1 = await isolatePool.run(heavyTask1);
  final result2 = await isolatePool.run(heavyTask2);

  print('Result 1: $result1');
  print('Result 2: $result2');

  // 关闭 Isolate 池
  isolatePool.close();
}

// 定义一个耗时任务
int heavyTask1() {
  // 模拟一个耗时的计算
  return 42;
}

// 定义另一个耗时任务
String heavyTask2() {
  // 模拟一个耗时的计算
  return 'Hello from Isolate!';
}

5. 关闭 Isolate 池

当你不再需要使用 Isolate 池时,可以关闭它以释放资源:

isolatePool.close();

6. 异常处理

你可以在任务中处理异常,并在主线程中捕获它们:

try {
  final result = await isolatePool.run(heavyTaskWithError);
} catch (e) {
  print('Error: $e');
}

7. 传递参数

你可以将参数传递给任务函数:

final result = await isolatePool.run(heavyTaskWithParameters, 'Hello', 42);

String heavyTaskWithParameters(String message, int number) {
  return '$message $number';
}

8. 使用 Compute 函数

isolate_easy_pool 也支持使用类似于 compute 的函数来简化 Isolate 的使用:

final result = await isolatePool.compute(heavyTaskWithParameters, 'Hello', 42);
回到顶部