Isolate

作者: 旺仔_100 | 来源:发表于2021-06-14 22:30 被阅读0次

在Dart中并发是通过Isolate来实现的。Isolate和线程的区别是它不共享内存。
Dart VM中采用了多生代算法进行垃圾回收。

主Isolate和创建的Isolate之间是通过管道进行通信的,而且还是单向的。如果需要结果回传还需要创建另一个管道,十分繁琐。
dart中封装了这个双向管道通信:compute。


Isolate isolate;

start() async {
  ReceivePort receivePort= ReceivePort();//创建管道
  //创建并发Isolate,并传入发送管道
  isolate = await Isolate.spawn(getMsg, receivePort.sendPort);
  //监听管道消息
  receivePort.listen((data) {
    print('Data:$data');
    receivePort.close();//关闭管道
    isolate?.kill(priority: Isolate.immediate);//杀死并发Isolate
    isolate = null;
  });
}
//并发Isolate往管道发送一个字符串
getMsg(sendPort) => sendPort.send("Hello");

//并发计算阶乘
Future<dynamic> asyncFactoriali(n) async{
  final response = ReceivePort();//创建管道
  //创建并发Isolate,并传入管道
  await Isolate.spawn(_isolate,response.sendPort);
  //等待Isolate回传管道
  final sendPort = await response.first as SendPort;
  //创建了另一个管道answer
  final answer = ReceivePort();
  //往Isolate回传的管道中发送参数,同时传入answer管道
  sendPort.send([n,answer.sendPort]);
  return answer.first;//等待Isolate通过answer管道回传执行结果
}

//Isolate函数体,参数是主Isolate传入的管道
_isolate(initialReplyTo) async {
  final port = ReceivePort();//创建管道
  initialReplyTo.send(port.sendPort);//往主Isolate回传管道
  final message = await port.first as List;//等待主Isolate发送消息(参数和回传结果的管道)
  final data = message[0] as int;//参数
  final send = message[1] as SendPort;//回传结果的管道 
  send.send(syncFactorial(data));//调用同步计算阶乘的函数回传结果
}

//同步计算阶乘
int syncFactorial(n) => n < 2 ? n : n * syncFactorial(n-1);
main() async => print(await asyncFactoriali(4));//等待并发计算阶乘结果

//同步计算阶乘
int syncFactorial(n) => n < 2 ? n : n * syncFactorial(n-1);
//使用compute函数封装Isolate的创建和结果的返回
main() async => print(await compute(syncFactorial, 4));

相关文章

  • flutter-isolate详解

    一. isolate简介 Dart 是单线程,Dart 为我们提供了 isolate,isolate 跟线程差不多...

  • Futter 练习 Isolate

    简介 Dart 提供了 isolate, isolate与线程类似,isolate与线程的区别是 :线程与线程之间...

  • Isolate

    1、(Isolate)隔离的定义:类似于线程(区别就是Isolate数据不能通用,只能把数据传回主Isolate,...

  • flutter学习笔记二

    Isolate--------------------------------------------------...

  • Dart 并发处理之Isolate

    Isolate 隔离运行

  • Flutter 93: 图解 Dart 单线程实现异步处理之 I

    小菜刚学习了 Isolate 的部分基本用法,今天继续尝试 compute 及其使用方式; Isolate 小菜之...

  • isolate

    我不知道怎样算是抑郁症或精神病,但至少此刻或者说那么多年的我精神深处一直处于低迷的状态。现在的我,刚刚经历了人生第...

  • isolate

    无可对抗,亦无法放下, 突然有点不懂怎么面对自己, 缓慢的而突如其来的,不安。 如果再对着月娘许愿, 大概就是"工...

  • Isolate

    "心有多大舞台就有多大"曾经这是写在书桌旁的座右铭,如今长大了,心开阔了,想的也多了。可是想太多,终归处于一种疲劳。

  • Isolate

    Group up friend, why are you all leave me? You know, I'm ...

网友评论

      本文标题:Isolate

      本文链接:https://www.haomeiwen.com/subject/zaclkltx.html