Flutter异步并行任务处理插件async_parallel_queue的使用

Flutter异步并行任务处理插件async_parallel_queue的使用

库简介

async_parallel_queue 是一个用于按顺序排队异步回调的库。你可以等待它们完成,并且可以通过ID取消执行。

使用方法

回调注册后将按顺序执行。你可以选择并行运行的回调数量来同时运行多个回调。

import 'package:async_parallel_queue/async_parallel_queue.dart';

void main() {
  final queue = AsyncParallelQueue<int>(
    workers: 1, // 并行运行的回调数量
    verbose: true, // 启用队列状态日志
  );

  queue.registerCallback(1, () { print('foo'); });
  queue.registerCallback(2, () { print('boo');  });
  queue.registerCallback(3, () async {
    await Future.delayed(Duration.zero);
    print('bar'); 
  });
}

等待完成

你可以将 registerCallback 作为函数包装器使用,并等待其结果。注意:键是必需的。

import 'package:async_parallel_queue/async_parallel_queue.dart';

Future<int> dummyHttpRequest() async {
  await Future.delayed(Duration.zero);
  return 42;
}

void main() async {
  final queue = AsyncParallelQueue();

  final response = await queue.registerCallback(
    DateTime.now(),
    dummyHttpRequest,
  );

  print('The number is $response');
}

你还可以使用 .then 方法来排队多个请求,并使用它们的结果。

import 'package:async_parallel_queue/async_parallel_queue.dart';

Future<String> dummyHttpRequest(String response) async {
  await Future.delayed(Duration.zero);
  return response;
}

void main() async {
  final queue = AsyncParallelQueue(workers: 1);

  queue.registerCallback<String>(1, () {
    return dummyHttpRequest('foo again');
  }).then(print);

  queue.registerCallback<String>(2, () {
    return dummyHttpRequest('boo again');
  }).then(print);

  queue.registerCallback<String>(3, () {
    return dummyHttpRequest('bar again');
  }).then(print);
}

类型指定

你可以指定返回类型。回调是 FutureOr<T>,这意味着它可以是同步或异步的。

import 'package:async_parallel_queue/async_parallel_queue.dart';

void main() async {
  final queue = AsyncParallelQueue<int>(
    workers: 1, // 并行运行的回调数量
    verbose: true, // 启用队列状态日志
  );
  var message = '';

  queue.registerCallback<String>(2, () {
    return 'the answer';
  }).then((value) => message = '$message $value');

  queue.registerCallback<String>(3, () async {
    await Future.delayed(Duration.zero);
    return 'is';
  }).then((value) => message = '$message $value');

  await queue.registerCallback<int>(1, () {
    return 42;
  }).then((value) => message = '$message $value');

  print(message);
}

取消回调

你可以随时取消队列中的回调。它会从队列中注销回调并抛出 CallbackCancelledException你不能停止已经运行的回调。

import 'package:async_parallel_queue/async_parallel_queue.dart';

Future<String> dummyHttpRequest(String response) async {
  await Future.delayed(Duration.zero);
  return response;
}

void main() async {
  final queue = AsyncParallelQueue(workers: 1);

  queue.registerCallback<String>(1, () {
    return dummyHttpRequest('foo once more');
  }).then(print);

  queue.registerCallback<String>(2, () {
    queue.cancelCallback(3); // 取消回调3
    return dummyHttpRequest('boo once more');
  }).then(print);

  queue.registerCallback<String>(3, () {
    return dummyHttpRequest('bar once more');
  }).then(print).catchError((error) {
    print(error.runtimeType);
  });
}

由于所有回调都是同步注册的,你可以在回调2中停止回调3。

注意重复使用相同的键

键在此库中用于防止一个回调如果还在队列中时再次运行。如果你尝试注册具有队列中已存在回调的相同键的新回调,则会抛出 KeyAlreadyInUseException 异常。

void main() {
  void main() async {
  final queue = AsyncParallelQueue(workers: 1);

  queue.registerCallback('same key', () {});
  queue.registerCallback('same key', () {}); // 抛出 KeyAlreadyInUseException
}

最后,如果你的函数不在队列中或者正在运行,你可以重新使用键。当然,当函数离开队列开始运行时,它还是会这样做的!

void main() async {
  final queue = AsyncParallelQueue(workers: 1);

  queue.registerCallback('same key', () {
    print('foo for the last time');

    queue.registerCallback('same key', () {
      print('boo for the last time');
      
      queue.registerCallback('same key', () {
        print('bar for the last time');
      });
    });
  });
}

更多关于Flutter异步并行任务处理插件async_parallel_queue的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter异步并行任务处理插件async_parallel_queue的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


async_parallel_queue 是一个用于在 Flutter 中处理异步并行任务的插件。它允许你创建一个任务队列,并控制任务的并发执行数量。这对于需要并行处理多个异步任务,但又需要限制同时执行的任务数量的场景非常有用。

安装插件

首先,你需要在 pubspec.yaml 文件中添加 async_parallel_queue 依赖:

dependencies:
  flutter:
    sdk: flutter
  async_parallel_queue: ^1.0.0  # 请使用最新版本

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

基本用法

  1. 导入包

    import 'package:async_parallel_queue/async_parallel_queue.dart';
    
  2. 创建队列

    你可以创建一个 AsyncParallelQueue 实例,并指定最大并发任务数。

    final queue = AsyncParallelQueue(maxConcurrentTasks: 3);
    
  3. 添加任务

    你可以向队列中添加异步任务。任务可以是 Future 或者 Future Function()

    queue.add(() async {
      await Future.delayed(Duration(seconds: 1));
      print('Task 1 completed');
    });
    
    queue.add(() async {
      await Future.delayed(Duration(seconds: 2));
      print('Task 2 completed');
    });
    
    queue.add(() async {
      await Future.delayed(Duration(seconds: 3));
      print('Task 3 completed');
    });
    
    queue.add(() async {
      await Future.delayed(Duration(seconds: 4));
      print('Task 4 completed');
    });
    
  4. 等待所有任务完成

    你可以使用 queue.onComplete 来等待所有任务完成。

    await queue.onComplete;
    print('All tasks completed');
    

完整示例

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Async Parallel Queue Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              final queue = AsyncParallelQueue(maxConcurrentTasks: 2);

              queue.add(() async {
                await Future.delayed(Duration(seconds: 1));
                print('Task 1 completed');
              });

              queue.add(() async {
                await Future.delayed(Duration(seconds: 2));
                print('Task 2 completed');
              });

              queue.add(() async {
                await Future.delayed(Duration(seconds: 3));
                print('Task 3 completed');
              });

              queue.add(() async {
                await Future.delayed(Duration(seconds: 4));
                print('Task 4 completed');
              });

              await queue.onComplete;
              print('All tasks completed');
            },
            child: Text('Run Tasks'),
          ),
        ),
      ),
    );
  }
}
回到顶部