Dart多线程---Isolate
isolate是Dart对actor并发模式的实现。运行中的Dart程序由一个或多个actor组成,这些actor也就是Dart概念里面的isolate。isolate是有自己的内存和单线程控制的运行实体。isolate本身的意思是“隔离”,因为isolate之间的内存在逻辑上是隔离的。isolate中的代码是按顺序执行的,任何Dart程序的并发都是运行多个isolate的结果。因为Dart没有共享内存的并发,没有竞争的可能性所以不需要锁,也就不用担心死锁的问题。
正是由于Isolate之间没有内存共享,他们之间的唯一通讯方式只能是通过Port进行,而且这个消息传递是异步的。
具体的Isolate的分析可以看下我就是 Flutter Engine线程管理与Dart Isolate机制
验证Isolate的通信方式
void multiThreat(){
//Isolate
print("开始执行threat");
//创建一个Isolate,设置初始值,在fun中执行(类似于多线程执行)
//一个Isolate相当于一个进程,有自己独立的内存和数据,和当前是隔离的,不用担心多线程的资源抢夺问题
Isolate.spawn(test1, 10);
sleep(Duration(seconds: 1));
print("isolate回来之后a的值==$a");
//两次a的值是不同的,在两个进程中 数据不共享
print("结束执行threat");
}
int a = 0;
void test1(int count){
a = count;
print("isolate执行完毕1===$count");
print("修改之后的a的值==$a");
}
//输出值
开始执行threat
isolate执行完毕1===10
修改之后的a的值==10
isolate回来之后a的值==0
结束执行threat
可以看到明明在test1中修改了a的值,但是在isolate执行之后 a的值还是0,这是由于在两个隔离的进程中修改数据,数据不共享造成的,我们可以在执行的时候打印出当前的Isolate进行验证
void multiThreat(){
//Isolate
print("开始执行threat");
//创建一个Isolate,设置初始值,在fun中执行(类似于多线程执行)
//一个Isolate相当于一个进程,有自己独立的内存和数据,和当前是隔离的,不用担心多线程的资源抢夺问题
Isolate.spawn(test1, 10);
sleep(Duration(seconds: 1));
print("isolate回来之后a的值==$a,===当前进程${Isolate.current.debugName}");
//两次a的值是不同的,在两个进程中 数据不共享
print("结束执行threat");
}
int a = 0;
void test1(int count){
a = count;
print("isolate执行完毕1===$count");
print("修改之后的a的值==$a,===当前进程${Isolate.current.debugName}");
}
//输出值. 在不同的进程中执行,数据不能共享
开始执行threat
isolate执行完毕1===10
修改之后的a的值==10,===当前进程test1
isolate回来之后a的值==0,===当前进程main
结束执行threat
创建多个Isolate,执行的顺序也是不定的
void multiThreat(){
//Isolate
print("开始执行threat");
//创建一个Isolate,设置初始值,在fun中执行(类似于多线程执行)
//一个Isolate相当于一个进程,有自己独立的内存和数据,和当前是隔离的,不用担心多线程的资源抢夺问题
//下面执行的顺序是不定的
Isolate.spawn(test1, 10);
Isolate.spawn(test2, 20);
Isolate.spawn(test3, 30);
sleep(Duration(seconds: 1));
print("isolate回来之后a的值==$a,===当前进程${Isolate.current.debugName}");
//两次a的值是不同的,在两个进程中 数据不共享
print("结束执行threat");
}
int a = 0;
void test1(int count){
a = count;
print("isolate执行完毕1===$count");
print("修改之后的a的值==$a,===当前进程${Isolate.current.debugName}");
}
void test2(int count){
print("isolate执行完毕2===$count,===当前进程${Isolate.current.debugName}");
}
void test3(int count){
print("isolate执行完毕3===$count,===当前进程${Isolate.current.debugName}");
}
///输出值
开始执行threat
isolate执行完毕1===10
修改之后的a的值==10,===当前进程test1
isolate执行完毕3===30,===当前进程test3
isolate执行完毕2===20,===当前进程test2
isolate回来之后a的值==0,===当前进程main
结束执行threat
//test1 2 3和当前执行的multiThreat方法不在一个Isolate 中,数据不会同步
Isolate的简单通信---ReceivePort
/// Isolate简单通信
void mulIsolateSendMessage() async{
//定义port
ReceivePort port = ReceivePort();
//定义isolate
Isolate iso = await Isolate.spawn(testPortFunc , port.sendPort);
//监听port 拿到发送的值,回到该进程
port.listen((message) {
print("拿到isolate的数据===$message");
//执行完了之后iso要释放掉
port.close();
iso.kill();
});
}
void testPortFunc(SendPort port){
//使用sendport 在isolate中进行数据通信
port.send("我就是我,不一样的烟火");
}
//输出值
拿到isolate的数据===我就是我,不一样的烟火
以上是对Isolate的一个简单认识,先记录一下
网友评论