isolate

定义

isolate是Dart对actor并发模式的实现。运行中的Dart程序由一个或多个actor组成,这些actor也就是Dart概念里面的isolate。isolate是有自己的内存和单线程控制的运行实体。isolate本身的意思是“隔离”,因为isolate之间的内存在逻辑上是隔离的。isolate中的代码是按顺序执行的,任何Dart程序的并发都是运行多个isolate的结果。因为Dart没有共享内存的并发,没有竞争的可能性所以不需要锁,也就不用担心死锁的问题。

由于isolate之间没有共享内存,所以他们之间的通信唯一方式只能是通过Port进行,而且Dart中的消息传递总是异步的。

isolate跟线程类似,但线程之间可以共享内存,isolate不可以。

原理

Read More

异步编程

isolate机制

Dart是单线程模型,它的并发机制叫isolate。APP的启动入口main函数就是一个类似Android主线程的一个主isolate。和Java的Thread不同的是,Dart中的isolate无法共享内存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

// 导入isolate包
import 'dart:isolate';

// 使用async关键词将main函数标记为一个异步函数,这样才能使用await关键词
void main() async {
// 使用await关键词等待任务执行完成
await Isolate.spawn<String>(subTask, "Task1 parameter");

// main函数结束标记
print("main func end.");
}

// Isolate入口函数定义,接受一个String参数
void subTask(String msg) {
print("subTask recv: $msg");
}

消息机制

Dart在执行完main函数后,就会由Loop开始执行两个任务队列中的Event。首先Loop检查微服务队列,依次执行Event,当微服务队列执行完后,就检查Event queue队列依次执行,
在执行Event queue的过程中,每执行完一个Event就再检查一次微服务队列。所以微服务队列优先级高,可以利用微服务进行插队。

Future

在 Dart 库中随处可见 Future 对象,通常异步函数返回的对象就是一个 Future。 当一个 future 执行完后,他里面的值就可以使用了,可以使用then()来在future完成的时候执行其他代码。Future对象其实就代表了在事件队列中的一个事件的结果。

Read More

消息机制

概述

Dart在执行完main函数后,就会由Loop开始执行两个任务队列中的Event。首先Loop检查微服务队列,依次执行Event,当微服务队列执行完后,就检查Event queue队列依次执行,在执行Event queue的过程中,没执行完一个Event就再检查一次微服务队列。所以微服务队列优先级高,可以利用微服务进行插队。

  • event队列:包含所有外来的事件:I/O,mouse events,drawing events,timers,isolate之间的message等。

  • microtask队列:在Dart中是必要的,因为有时候事件处理想要在稍后完成一些任务但又希望是在执行下一个事件消息之前。

Read More