4.Dart多线程---Isolate

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的一个简单认识,先记录一下

参考资料

Flutter 92: 图解 Dart 单线程实现异步处理之 Isolate (一)

Flutter Engine线程管理与Dart Isolate机制

你可能感兴趣的:(4.Dart多线程---Isolate)