Dart并发编程: isolate

我们都知道,在Flutter开发中,App单线程运行的,那既然是单线程运行,那么它能否做到并发处理多个任务呢?答案是可以的,首先,我们先来了解isolate

isolates

之前从事iOS开发,或者其他平台App开发的人员,在App运行时,都会有一个主线程,可以开启多个子线程进行多个任务并发执行。在Dart中,所有代码都运行在isolate中,每个isolate都有它们各自的内存堆栈,确保每个isolate的状态都是独立的,互不影响。因为isolate之间没有共享的内存空间,所以,我们就不用使用各种锁来保证数据的安全性。

Main isolate

默认情况下,所有的Dart代码都在main isolate中。

截屏2022-05-15 下午3.22.19.png

通过使用 async-await 等待异步操作完成,然后继续执行下一行代码,即使是单隔离程序也可以顺利执行。一个良好的App,会启动很快,然后开启EventLoop来响应Event队列中的Event事件。

isolate的生命周期

如下图所示,每一个isolate由某些Dart代码开启。例如main()方法。在isolate中会注册一些事件监听者,处理用户的交互操作或者文件的I/O操作。当处理完 Event事件,返回结果,该isolate就会退出。

截屏2022-05-15 下午3.48.54.png

处理Event

在客户端App中,在main isolateEvent queue中,会包含多个Repaint请求,一些UI事件或者Button回调事件。 Event Loop会按照Event Queue先入先出的顺序,处理Event事件。

截屏2022-05-15 下午3.55.34.pngmain()调用时,就会执行Event Handler,如下图所示:

截屏2022-05-15 下午3.58.56.png 需要注意的是,如果某个EventHandler 的同步操作,耗时太长,就会造成App响应卡顿,如下图所示,Tap Handler耗费了太多时间,超过了预期处理时间就会造成响应卡顿。

截屏2022-05-15 下午4.10.14.png

Worker isolate

当处理耗时的计算,例如处理一个较大的JSON数据时。此时我们可以开启另外一个isolate进行JSON数据解析,我们称这个worker isolatebackground isolate,当这个worker isolate执行完成后,将结果返回给main isolate

截屏2022-05-15 下午4.19.39.png

需要注意的是,在isolate之间传递的数据,需要满足sendable,关于哪些对象满足sendable状态,大家可以参考 send() method API 说明。

worker isolate示例

void main() async {
  // Read some data.
  final jsonData = await _parseInBackground();

  // Use that data
  print('Number of JSON keys: ${jsonData.length}');
}

// Spawns an isolate and waits for the first message
Future<Map<String, dynamic>> _parseInBackground() async {
  final p = ReceivePort(); // 1
  await Isolate.spawn(_readAndParseJson, p.sendPort); // 2 
  return await p.first as Map<String, dynamic>; // 3
}

Future<void> _readAndParseJson(SendPort p) async {
  final fileData = await File(filename).readAsString();
  final jsonData = jsonDecode(fileData);
  Isolate.exit(p, jsonData);
}
复制代码
  • 1,在创建isolate之前,先创建一个ReceievePort,用来从worker isolatemain isolate传递数据。
  • 2,使用Isolate.spawn()创建一个新isolate,用来执行_readAndParseJson操作。
  • 3,一旦isolate创建完成,main isolate开始等待 work isolate传递最后的处理结果。

main isolatework isolate之间的通信如下图所示 截屏2022-05-15 下午5.07.58.png

本篇文章关于isolate的介绍就先到这,了解更多,可参考Dart官方文档。

本篇文章参考Dart官方文档 isolates

猜你喜欢

转载自juejin.im/post/7098558405622628365