忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

DartのIsolateを使う その2

前回は一方通行の通信でした。
子Isolateから親Isolateに情報を送りましたが、逆はありませんでした(SendPortオブジェクト以外)。
今回は、Isolate間でメッセージを相互に送ります。


プログラム

isolatetest.dart

import "dart:isolate";

void main() {
  ReceivePort fromSubIsolate = new ReceivePort();
  Isolate.spawnUri(
      new Uri.file("subIsolate.dart"), 
      [],
      fromSubIsolate.sendPort);

  SendPort sendPort = null;
  
  fromSubIsolate.listen((message){
    if(message is SendPort){
      sendPort = message;
      sendPort.send([1, 2]);
    }
    if(message is int){
      print(message);
    }
  });
}

subIsolate.dart

import "dart:isolate";

void main(List<String> args, SendPort sendPort){
  ReceivePort fromMainIsolate = new ReceivePort();
  sendPort.send(fromMainIsolate.sendPort);
  fromMainIsolate.listen((message){
    List<int> parameters = message;
    sendPort.send(parameters.reduce((a, b) => a + b));
  });
}

結果

3

解説

このプログラムは別のIsolateで1 + 2を計算します。
メインのIsolateでその計算結果である3を表示しています。

メインのIsolateでは最初に1と2を用意しています。
計算は子Isolateで行い、結果をメインに戻し、表示するのです。

SendPortでは、自分の作ったSendPortを送ることができます。
それを使って、親Isolateから子Isolateにメッセージを送っているのですね。
親Isolateは初めはSendPortしか送っていませんが、これによっていくらでもデータを送ることができるようになりました。

拍手[0回]

PR