Двунаправленная связь с изолятами в Dart 2 - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь изолировать, и мне интересно, как я мог порождать некоторых из них, делая тяжелые вычисления, которые, когда корневой изолятор спрашивает их об их текущей вычислительной стоимости, они отвечают ему "по требованию".

Насколько я знаю, единственным объектом, который может использоваться в качестве сообщения для вновь созданных изолятов, является SendPort, что означает, что только порожденный изолят может взаимодействовать с корневым изолятом. Я попытался отправить кортеж , но поскольку ReceivePort не является SendPort, он считается незаконным.

В двух словах:

root <- изолировать <strong>хорошо

root <-> изолировать как?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

С Гюнтер комментарий Я сделал это:

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]);
}

Хотя с Кевином ответ код упрощен до:

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");
}
0 голосов
/ 11 сентября 2018

Посмотрите на IsolateChannel из пакета : stream_channel .

Это должно обеспечить МНОГО помощи в том, что вы пытаетесь сделать.

...