在Dart中实现并发可以用Isolate,它是类似于线程(thread)但不共享内存的独立运行的worker,是一个独立的Dart程序执行环境。其实默认环境就是一个main isolate。

在Dart语言中,所有的Dart代码都运行在某个isolate中,代码只能使用所属isolate的类和值。不同的isolate可以通过port发送message进行交流。(首字母大写的Isolate代表Isolate对象,小写的isolate代表一个独立的Dart代码执行环境)

一个Isolate对象就是一个isolate(执行环境)的引用,通常不是当前代码所在的isolate,也就是说,当你使用Isolate对象时,你的目的应该是控制其他isolate,而不是当前的isolate。
当你要spawn(产生)一个新isolate时,如果操作成功,当前isolate会接收到一个代表新isolate的Isolate对象。

isolate在它自己的事件循环(event loop)中执行代码,每个事件都可以在该isolate的微任务队列(microtask queue)中执行更小的任务。(点击查看更多关于事件循环与微任务队列的资料)

Isolate对象允许其他isolate控制、监听它所代表的isolate的事件循环,例如当这个isolate发生未捕获错误时,可以暂停(pause)此isolate或获取(addErrorListener)错误信息。

controlPort识别并授予对isolate控制的权限,pauseCapability和terminateCapability会对某些控制操作进行权限保护。例如,暂停(pause)一个无pauseCapability的Isolate对象是不生效的。

由spawn操作创建的Isolate对象具有控制接口(control port)和控制该对象的能力(capability)。当然, 用Isolate.Isolate构造方法创建的Isolate对象可以不必带有这些能力。

Isolate对象不能用SendPort发送给另一个Isolate对象,但是控制接口(control port)和能力(capability)是可以发送的,并且可以在另一个Isolate对象中用发送来的接口与能力创建一个新的Isolate对象。

Spawn<T>方法

spawn<T>(
    void entryPoint(T message),
    T message, {
        bool paused: false,
        bool errorsAreFatal,
        SendPort onExit,
        SendPort onError
    }
) → Future<Isolate>

创建一个与当前isolate共享代码的isolate(并不是共享内存,仅代码)。

entryPoint参数指定了调用产生的isolate时的初始函数。入口函数(entry-point function)在新isolate中以message作为唯一参数被调用。(可以想到,默认的isolate以main()函数作为入口)

这个函数必须是可以以单一参数调用的全局函数或静态方法,也就是说,它应该是接收至少一个位置参数并且最多一个必要位置参数的编译时函数常量值。只要它能用一个参数来调用,它可以接收任意数量的可选参数。它不能是函数表达式或实例方法。

初始化消息(message)通常包含一个SendPort,以便生产者与被产者互相交流。

如果paused参数赋值为true,那么这个isolate启动时就是entryPoint方法调用前的暂停状态,就像初始化时就调用了isolate.pause(isolate.pauseCapability)一样。要恢复运行,可以调用isolate.resume(isolate.pauseCapability)。
如果errorsAreFatal、 onExit 和/或 onError 参数被赋值,就相当于在isolate启动前,setErrorsFatal, addOnExitListener 和/或 addErrorListener 分别以相应参数调用。

如果忽略errorsAreFatal参数,平台会以默认行为或者继承自当前isolate的行为来处理错误。

你也可以对返回的isolate调用setErrorsFatal、addOnExitListener 和 addErrorListene等方法,但是除非isolate以pause状态启动,它在这些方法调用前可能已经执行完毕了。

示例

import 'dart:async';
import 'dart:isolate';main() async {var receivePort = new ReceivePort();await Isolate.spawn(echo, receivePort.sendPort);// 'echo'发送的第一个message,是它的SendPortvar sendPort = await receivePort.first;var msg = await sendReceive(sendPort, "foo");print('received $msg');msg = await sendReceive(sendPort, "bar");print('received $msg');
}/// 新isolate的入口函数
echo(SendPort sendPort) async {// 实例化一个ReceivePort 以接收消息var port = new ReceivePort();// 把它的sendPort发送给宿主isolate,以便宿主可以给它发送消息sendPort.send(port.sendPort);// 监听消息await for (var msg in port) {var data = msg[0];SendPort replyTo = msg[1];replyTo.send(data);if (data == "bar") port.close();}
}/// 对某个port发送消息,并接收结果
Future sendReceive(SendPort port, msg) {ReceivePort response = new ReceivePort();port.send([msg, response.sendPort]);return response.first;
}

注意

目前无法在新isolate中调用平台方法(platform channel method),调用时应用会闪退且没有报错信息。

详情请看 Unable to call a platform channel method from a another isolate #13937

Avenge应用商店

Flutter中文文档

Dart - Isolate 并发相关推荐

  1. dart调用python_Dart - Isolate 并发

    在Dart中实现并发可以用Isolate,它是类似于线程(thread)但不共享内存的独立运行的worker,是一个独立的Dart程序执行环境.其实默认环境就是一个main isolate. 在Dar ...

  2. 聊一聊Flutter Engine线程管理与Dart Isolate机制

    阿里妹导读:Flutter是一款开源的移动跨平台UI开发套件,它不仅与现存的Native代码兼容,还能帮你用Dart语言快速开发高质量的跨平台App. 本文由闲鱼技术团队福居撰写,结合Flutter ...

  3. 【Flutter入门到进阶】Dart进阶篇---多线程异步Isolate

    1 Isolate 1.1 什么是Isolate 1.1.1 概念 线程?异步?隔离?到底什么意思?         Isolate中文意思是隔离,从使用角度来说是Dart的线程,但是从本质虚拟机的实 ...

  4. dart系列之:dart优秀的秘诀-隔离机制

    文章目录 简介 dart中的隔离机制 生成一个Isolate Isolate之间的交互 一个例子 总结 简介 之前介绍了很多dart中的异步编程技巧,不知道大家有没有发现一个问题,如果是在java的异 ...

  5. Dart 2.15 发布的新特性

    原文链接 https://medium.com/dartlang/dart-2-15-7e7a598e508a Dart SDK 的 2.15 版新增了具备更快并发能力的 isolates .支持 t ...

  6. 【Dart】一门为跨端开发而生的编程语言

    目录 一.Dart 语言概述: Dart 语言特点: Dart 库: Dart 平台: Web 平台的 Dart (使用 JavaScript 开发和部署): Dart 运行时环境: 二.配置 Dar ...

  7. Flutter——Isolate主线机制

    简述 在DartFlutter应用程序启动时,会启动一个主线程其实也就是Root Isolate,在Root Isolate内部运行一个EventLoop事件循环.所以所有的Dart代码都是运行在Is ...

  8. java c# 线程,DART隔离和线程(Java,C#)之间的区别

    For me The DART Isolate looks like a Thread (Java/C#) with a different terminology. In which aspect ...

  9. android 异步编程,flutter异步编程-事件循环、Isolate、Stream(流)

    事件循环.Isolate 开始前我们需要明白 Dart 是单线程的并且 Flutter 依赖于 Dart 如果你知道js 中的event loop 将很好理解dart的整个异步过程 先看一段代码 im ...

最新文章

  1. python代码实现二叉树的分层打印
  2. pycharm 远程调试图文_Pycharm配置远程调试的图文步骤
  3. IOS进阶之WKWebView
  4. 现金流量表的编制公式
  5. [C++基础]025_虚函数和虚函数表
  6. 揭秘HTML5和CSS3
  7. 可扩展架构设计的三个维度
  8. 华为推出鸿蒙超级系统,华为鸿蒙系统正式发布!十个人里竟然只有两个人支持?...
  9. 继承基础概念与公有继承
  10. Atitit 近年来的软件与编程与技术趋势大盘点 and 2017 未来技术趋势attilax总结
  11. uipath 收邮件_UIpath 循环读取IMAP邮件,并保存附件
  12. 360服务器安全加固系统,360政企安全
  13. 地理信息系统概论 - 地理信息系统(1)
  14. python播放mp3文件 playsound_播放声音文件 函数playsound()
  15. 漫谈多模光纤类型:OM1、OM2、OM3、OM4、OM5,深度好文,值得阅读
  16. 计算机专业就业尴尬问题,计算机专业就业困境初探
  17. 超分算法IPT:Pre-Trained Image Processing Transformer
  18. 家事:庆祝父亲60岁生日
  19. 大型三甲医院医学影像PACS系统源码(三维重建)
  20. 怎么做副业越做越好?看钟汉良抱大腿白皮书

热门文章

  1. 网络流量可视化分析平台-流影-FlowShadow
  2. MySQL数据库——MySQL字符集和校对规则详解
  3. Windows CMD 指令for遍历文件夹
  4. 面试官:你做过什么有亮点的项目吗?
  5. 记双系统 ubuntu18.04 无线网卡驱动安装
  6. java基础学习-6
  7. 华为OD机试 - 转骰子
  8. 世界杯32强口号出炉 谁的口号最奇葩?!
  9. 1036. Boys vs Girls
  10. 电动执行器市场现状及未来发展趋势