在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方法

spawn(

void entryPoint(T message),

T message, {

bool paused: false,

bool errorsAreFatal,

SendPort onExit,

SendPort onError

}

) → Future

创建一个与当前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,是它的SendPort

var 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

Flutter中文文档

dart调用python_Dart - Isolate 并发相关推荐

  1. Dart - Isolate 并发

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

  2. Dart 调用C语言混合编程

    Dart 调用C语言 本篇博客研究Dart语言如何调用C语言代码混合编程,最后我们实现一个简单示例,在C语言中编写简单加解密函数,使用dart调用并传入字符串,返回加密结果,调用解密函数,恢复字符串内 ...

  3. 硬触发控制相机拍照matlab代码,使用matlab调用摄像头拍照并发到邮箱

    之前在网上看到有用matlab调用摄像头的,也有用matlab发送电子邮件的,所以突发奇想,何不将这两者结合起来,即使用matlab先调用摄像头拍照,再将照片发到邮箱里面,如果能将程序编译成exe文件 ...

  4. 干货 | Dart 并发机制详解

    Dart 通过 async-await.isolate 以及一些异步类型概念 (例如 Future 和 Stream) 支持了并发代码编程.本篇文章会对 async-await.Future 和 St ...

  5. Dart 异步编程之 Isolate 和事件循环

    尽管 Dart 是个单线程任务,但它提供 Future.Stream.后台任务以及其他特性用于编写现代异步程序以及响应式程序(Flutter).本文讲的是 Dart 后台任务的基础:Isolate 和 ...

  6. Dart 与 C 的互相调用

    从这篇文章开始将一起来研究 Dart 2.5 之后推出一个新的特性,就是 Dart 与 C(或 C++)的互操作.这就意味着在 Dart 可以做一些类似 JNI 操作. Dart 与 C 的互操作主要 ...

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

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

  8. dart基础之异步编程

    在java中,有Thread来代表一个线程,但是在dart中是没有线程概念的,只有类似于多线程的isolate.除此之外,还针对读文件.数组操作专门制定了一个异步Stream类,使用起来很方便.本次主 ...

  9. Dart vs Swift

    | 作者:Andrea Bizzotto | 原文链接:medium.com/coding-with- Dart 和 Swift 是我最喜欢的编程语言.我在商业和开源代码中广泛使用它们. 本文提供了 ...

最新文章

  1. Win 10 源码一览:0.5T 代码、400 万文件、50 万文件夹
  2. 程序员绩效总结_闲聊程序员的绩效考核
  3. python中使用函数的优点,对于python类使用“get函数”有什么好处?
  4. 三星s8和android auto,手机资讯导报:穿上马甲也认得三星GalaxyS8与LGG6再曝光
  5. shell printf命令:格式化输出语句
  6. python调用c代码
  7. sharepoint 2010 彻底删除用户
  8. github 如何设置项目的语言显示
  9. 【图文】如何在centos上安装tomcat
  10. 机器学习ai选股_机器学习技术能够有效用于选股吗?(下)
  11. DBeaverEE for Mac(数据库管理工具)v21.2.1中文版
  12. BZOJ 4415 洛谷 3988 [Shoi2013]发牌
  13. arduino 下载 https://downloads.arduino.cc/packages/package_index.json error
  14. 豪迈HOMAG变频器维修E107544豪迈变频器维修09F5C3B
  15. 项目管理十大知识领域之项目成本管理
  16. 项目研发阶段性总结模板
  17. Vijos 1055 奶牛浴场 最大子矩阵 算♂法①
  18. Unity学习第二周
  19. DCloud与APICloud的对比选择
  20. 决策树分类算法的案例(代码实现及运行测试)

热门文章

  1. 华为热设计工程师待遇_沃得分享 | 华为校招青睐哪些江浙沪高校?
  2. 解决ERROR 1044 (42000): Access denied for user
  3. linux messages日志为空,自定义linux系统日志格式(messages,cron,ssh等日志格式)
  4. 洛谷P1313 计算系数
  5. Spring4 SpringMVC Hibernate4 Freemaker 集成示例
  6. 关于C语言中一些常用函数的说明
  7. mysql查第二行,MYSQL查找第二行具有给定值的所有行
  8. matplotlib 设置标注方向_JQData + matplotlib 实现回测日志的交易细节可视化
  9. extundelete安装_Linux下高效数据恢复软件extundelete应用实战
  10. 一个完整的项目流程图_工程建设项目史上最完整的全流程图,必收藏备用!