Dart 2中与隔离的双向通信

时间:2018-09-10 14:20:47

标签: dart dart-isolates dart-2

我正在尝试隔离,我想知道如何让其中的一些人进行繁重的计算,当根隔离询问他们当前的计算值时,他们会“按需”响应它。

据我所知,唯一可以用作新创建隔离的消息的对象是SendPort,这意味着只有生成的隔离可以与根隔离进行通信。我尝试发送一个元组,但是由于ReceivePort不是SendPort,因此被认为是非法的。

简而言之:

  

根<-隔离

     

根<->隔离如何?

2 个答案:

答案 0 :(得分:3)

IsolateChannelpackage:stream_channel

这应该为您尝试做的事情提供很多帮助。

答案 1 :(得分:3)

使用Guntercomment,我做到了:

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

Stopwatch stopwatch = new Stopwatch();

main(args) async {
  ReceivePort rPort = new ReceivePort();
  rPort.listen((data) {
    print("<root> $data received");
    if (data is List) {
      String action = data[0];
      if (action == "register") {
        (data[1] as SendPort).send(stopwatch.elapsedMilliseconds);
      }
    }
  });
  stopwatch.start();
  await Isolate.spawn(elIsolate, rPort.sendPort);
  print("isolate spawned in ${stopwatch.elapsedMilliseconds} msecs"); //isolate spawned in 377 msecs
}

void elIsolate(SendPort sPort) {
  ReceivePort rPort = new ReceivePort();
  rPort.listen((data) {
    print("<Isolate> '$data' received"); //<Isolate> '387' received
  });
  sPort.send(["register", rPort.sendPort]);
}

使用Kevinanswer时,代码简化为:

import 'dart:async';
import 'dart:io';
import 'dart:isolate';
import 'package:stream_channel/stream_channel.dart';

Stopwatch stopwatch = new Stopwatch();

main(args) async {
  ReceivePort rPort = new ReceivePort();
  IsolateChannel channel = new IsolateChannel.connectReceive(rPort);
  channel.stream.listen((data) {
    print("<root> '$data' received at ${stopwatch.elapsedMilliseconds} msecs"); //<root> 'hello world' received at 1141 msecs
    channel.sink.add(stopwatch.elapsedMilliseconds);
  });
  stopwatch.start();
  await Isolate.spawn(elIsolate, rPort.sendPort);
  print("isolate spawned in ${stopwatch.elapsedMilliseconds} msecs"); //isolate spawned in 1111 msecs
}

void elIsolate(SendPort sPort) {
  IsolateChannel channel = new IsolateChannel.connectSend(sPort);
  channel.stream.listen((data) {
    print("<Isolate> '$data' received");
  });
  channel.sink.add("hello world");
}