dart中isolate使用学习

100 阅读1分钟

isolate

在Dart中,Isolate是一种并发模型,用于执行与主应用程序隔离的代码。Isolate提供了一种方式来创建独立的执行上下文,使得可以在多个Isolate之间并发执行代码,每个Isolate都有自己的内存空间,它们之间不会共享内存

api

ReceivePort.listen 接收数据 ReceivePort.sendPort 发送数据 Isolate.spawn 创建新的 并且可以传入参数

交互流程

  1. 在子isolate向主isolate中发送数据 主isolate中创建一个ReceivePort, 把主ReceivePort.SendPort传入到子isolate中用于向主isoalte发送数据,并且通过ReceivePort.listen 接收数据
  2. 在主isolate向子isolate中发送数据 创建一个子isolate,并重新创建一个子ReceivePort,并且通过ReceivePort.listen 接收数据,并通过主的SendPort发送子的ReceivePort.SendPort到主isolate,用于在主isolate中向子isolate发送数据
  3. 通过自己的ReceivePort来接收数据,把自己的SendPort传递给需要交互的Isolate中

code


void main() async {
  ReceivePort mainReceivePort = ReceivePort();

  Isolate isolate =
      await Isolate.spawn(isolateFunction, mainReceivePort.sendPort);

  mainReceivePort.listen((message) {
    print('Received message: $message');
    if (message is SendPort) {
      ///拿到SendPort了,可以向子isolate发送数据了
      message.send("可以向子isolate发送数据了");
    }
  });

  ///在特定的情况杀死
  isolate.kill(priority: Isolate.immediate);
}

///List<dynamic> args 多个参数
///该方法需要是顶级函数
void isolateFunction(SendPort sendPort) {
  ReceivePort receivePort = ReceivePort();
  ///发送到主Isolate,然后就可以通过子sendPort发送数据了
  sendPort.send(receivePort.sendPort);
  sendPort.send('Message from Isolate');
  receivePort.listen((message) {
    print('Received message: $message');
  });
}