Dart中的Isolate


基本概念

每个Isolate有自己的内存和EventLoop.不同的Isolate只能通过传递消息来进行通信.

Dart的Isolate没有内存共享机制,这样设计有一个好处,就是在处理内存分配和回收时,无需加锁,因为仅一个线程,并不会抢占.

每个Isolate都包含一个SendPort和ReceivePort.

其实ReceivePort一般需要Isolate自己创建,可以通过ReceivePort.sendPort得到对应的sendPort,使用这个sendPort的send方法发送信息,ReceivePort就会收到消息了.

image-20201125212527950

单向通信

import 'dart:isolate';

void main(List<String> arguments) async {
  var receivePort = ReceivePort();
  var isolate = await Isolate.spawn(sendData, receivePort.sendPort);
  receivePort.listen((message) {
    print('$message');
    receivePort.close();
    isolate.kill(priority: Isolate.immediate);
  });
}

void sendData(port) => port.send("Hello World");

双向通信

import 'dart:isolate';

void main(List<String> arguments) async {
    handleIsolate();
}

void handleIsolate() async {
  final receivePort = ReceivePort();
  SendPort sendPort;
  final isolate = await Isolate.spawn(currentIsolate, receivePort.sendPort,debugName: 'Isolate1');
  receivePort.listen((message) {
    if (message is SendPort){
      sendPort = message;
      print('双向通信建立成功!');
      sendPort.send('Isolate1 send a meesage (${isolate.debugName})');
      return;
    }
    print('Isolate1 接收到消息 $message , (${isolate.debugName})');
  });
}

void currentIsolate(SendPort sendPort) {
  var receivePort = ReceivePort();
  receivePort.listen((message) {
    print('current Isolate 接收到消息 $message , (${Isolate.current.debugName})');
    for(var i = 0; i < 100; i++){
      sendPort.send(i);
    }
  });
  sendPort.send(receivePort.sendPort);
}

Flutter中的compute()

import 'dart:async';
import 'dart:io';
import 'dart:isolate';

import 'package:flutter/foundation.dart';

Future<T> newIsolate<T>(Function(T message) entryPoint, T message) {
  return compute(entryPoint, message);
}

void testIsolate() async {
  final result = await compute(_processLongWork, "message");
  debugPrint(result);
}

String _processLongWork(String message) {
  debugPrint(Isolate.current.toString());
  sleep(Duration(
    seconds: 6,
  ));
  return message;
}

值得注意的就是Isolate的entryPoint方法需要是顶层函数或者静态方法.

使用场景

非必要场景,一般不实用Isolate.

当方法执行在100ms以下,可以使用Future;

当方法比较耗时,可能超过100ms,可以使用Isolate.

使用Isolate是有性能方面的代价的,比如内存使用会更多,存在OOM的风险.

Dart Team封装了一个 isolate库,可以简化Isolate相关的操作.


文章作者: 姜康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 姜康 !
评论
 上一篇
WebSocket WebSocket
什么是WebSocketWebSocket是一种网络传输协议,可以在单个TCP连接上进行全双工通信,位于OSI模型的应用层. 特点如下: 允许服务端主动向客户端推送数据 在HTTP端口80和443工作,支持HTTP代理和中介 WebSoc
2020-11-27
下一篇 
写个简单的短链接服务 写个简单的短链接服务
基本说明短链接服务就是一个将比较长的url转换为比较短的url的功能. 如果要实现一个短链接服务,至少要实现这几个功能: 将较长的url转换为较短的url 访问短链接可以直接访问到原网站/链接 时效性:永久有效/过期机制 统计与效率 如
2020-11-22
  目录