Dart中的任务执行队列
任务执行队列
1、Dart
任务的执行顺序
① 先执行MicroTask Queue
中的MicroTask
② MicroTask Queue
执行完之后,执行Event Queue
中的Event
③ 每次都会判断是否有新的MicroTask
和新的Event
,优先执行MicroTask
2、MicroTask
创建方法
① scheduleMicrotask(() {});
② Future.microtask(() {});
3、Event
创建方法
async
异步方法属于Event
Isolate
1、什么是Isolate
字面意思是隔离,即每个Isolate
是独立的,隔离的,内存不共享的。
官方文档或注释的一部分:
All Dart code runs in an isolate, and code can access classes and values only from the same isolate.
所有的 Dart 代码运行在一个 Isolate 里,代码只能访问同一个 Isolate 里的类和值。
Different isolates can communicate by sending values through ports.
不同的 isolate 能够通过 port 发送值进行交流。
An isolate is what all Dart code runs in. It’s like a little space on the machine with its own, private chunk of memory and a single thread running an event loop.
所有 Dart 代码运行在一个 Isolate 里,它像机器上的一个小空间,有自己的私有内存块和运行事件循环的单个线程。
2、两种方式可以生成Isolate
① Isolate.spawn
② compute()
3、Isolate
是如何实现内存隔离的
参考文章:[ Dart 中的
这里的内存指的就是堆内存,每个Isolate
的堆内存是随着Isolate
的创建而初始化。
4、Isolate
之间的通信
DartVM
支持的消息数据类型为:
① 原始数类型,如null
、bool
、double
、int
、String
等
② SendPort
实例,比如ReceivePort().sendPort
③ 包含①和②的list
和map
,也可以嵌套
④ 在DartVM
中,处于同一进程的2个Isolate
,也可以发送自定义的Class
实例对象,但dart2js
编译器不可以。
5、创建Isolate
示例
① 创建Isolate
② 准备获取发送过来的数据
③ 将2边sendPort
进行绑定
④ 创建监听,监听那边发过来的数据和SendPort
⑤ 开始往那边发送数据和SendPort
⑥ 等待那边处理数据
⑦ 监听到了那边发过来的数据和SendPort
⑧ 用拿到的数据进行大量的计算
⑨ 开始大量计算
⑩ 将计算完的数据发到那边
import 'dart:async';
import 'dart:isolate';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Column(
children: [
MaterialButton(
color: Colors.red,
onPressed: test,
child: Text('测试'),
),
],
),
);
}
void test() {
asyncFibonacci(3).then((value) {
print('执行:11'); // ----> 11. 拿到返回值
print(value);
});
/*
flutter: 执行:1
flutter: 执行:2
flutter: 执行:3
flutter: 执行:4
flutter: 执行:5
flutter: 执行:6
flutter: 执行:7
flutter: 执行:8
flutter: 执行:9
flutter: 执行:9
flutter: 执行:9
flutter: 执行:9
flutter: 执行:9
flutter: 执行:10
flutter: 执行:11
flutter: 2
*/
}
/// 创建Isolate来计算斐波那契数列第n个数
/// n从0开始
Future<dynamic> asyncFibonacci(int n) async {
/// 创建Isolate
/// 创建一个ReceivePort
/// Isolate所需参数,必须要有SendPort,SendPort需要ReceivePort创建
final receivePort = ReceivePort();
/// 第一个参数entryPoint:必须是一个顶层方法或静态方法
/// 第二个参数message:通常初始化message包含一个sendPort
print('执行:1'); // ----> 1. 创建Isolate
await Isolate.spawn(_isolateTopLevelFunction, receivePort.sendPort);
/// 获取sendPort来发送数据
print('执行:2'); // ----> 2. 准备获取发送过来的数据
final sendPort = await receivePort.first as SendPort;
/// 接收消息的receivePort
final answerReceivePort = ReceivePort();
/// 发送数据
print('执行:5'); // ----> 5. 开始往那边发送数据和SendPort
sendPort.send([Calculate(count: n), answerReceivePort.sendPort]);
/// 获取数据并返回
print('执行:6'); // ----> 6. 等待那边处理数据
return answerReceivePort.first;
}
}
/// Isolate的顶级方法
void _isolateTopLevelFunction(SendPort sendPort) {
final receivePort = ReceivePort();
/// 绑定
print('执行:3'); // ----> 3. 将2边sendPort进行绑定
sendPort.send(receivePort.sendPort);
/// 监听
print('执行:4'); // ----> 4. 创建监听,监听那边发过来的数据和SendPort
receivePort.listen((message) {
print('执行:7'); // ----> 7. 监听到了那边发过来的数据和SendPort
/// 获取数据并解析
final data = message[0] as Calculate;
final send = message[1] as SendPort;
/// 返回结果
print('执行:8'); // ----> 8. 用拿到的数据进行大量的计算
int num = syncFibonacci(data.count);
print('执行:10'); // ----> 10. 将计算完的数据发到那边
send.send(num);
});
}
/// 同步的斐波那契计算顶级方法
int syncFibonacci(int n) {
print('执行:9'); // ----> 9. 开始大量计算
return n < 2 ? n : syncFibonacci(n - 2) + syncFibonacci(n - 1);
}
class Calculate {
int count;
Calculate({required this.count});
}
相关文章
- Python中的函数与方法 以及Bound Method和Unbound Method
- 一文贯通python文件读取
- Python 中的异步编程:Asyncio
- 7个你现在就该学习Python的理由
- 提高Python运行效率的六个窍门
- Python数据科学:神经网络
- 一篇文章看懂大数据分析就业前景及职能定位
- R和Python中的文本挖掘:8个入门小贴士
- 告诉你为什么Python有点慢,但我却无所谓?
- 专注学习DevOps编程语言Top 5推荐
- Python发送邮件脚本
- Python多进程并行编程实践: mpi4py 的使用
- Python语言在未来的发展前景
- Python vs Ruby: 谁是最好的 web 开发语言?
- Python对Ruby:谁在Web开发领域更胜一筹?
- Python一行代码完成并行任务
- Python开发者2017应该关注的七个类库
- python爬虫入门基本知识
- 在终端中优雅地编写Python
- Python机器学习实战:信用卡欺诈检测