忍者ブログ

Memeplexes

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

DartのIsolateを使う その1

何回かにわたってDartのIsolate紹介記事を書こうと思います。

Dartで並列処理

Googleのプログラミング言語Dartにはスレッドがありません。
正確にはスレッドのようなものは、あるといえばあるのですが、だいぶ使い勝手が違います。

他の言語ではマルチスレッドはお手軽ですが、Dartではかなり制限されています。
他のスレッドのメモリへアクセスができません。
他のスレッドに情報を渡すには明示的に送ってやらなければいけません。
送れる情報はintやdoubleや文字列やそれらのリストなど、極めて限定されています。

おまけに、ブラウザ上で動かすためには、新たにdartのソースファイルを用意しなくてはいけないようです。
そのファイルに書かれたdartを、別スレッドで動かす感じです。
もちろんメモリは共有されません。
別プロセスで動かしているかのような感覚です。

ソースコード

isolatetest.dart

import "dart:isolate";

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

subIsolate.dart

import "dart:isolate";

void main(List<String> args, SendPort sendPort){
  sendPort.send("isolate created.");
}

実行結果

isolate is created.

解説

Dartではスレッドのことを、Isolateと呼びます。
正確にはIsolateはスレッドではなく、ほかのプロセスである可能性すらあるので、スレッドと呼ぶのは不適切かもしれません。

このプログラムでは別のIsolateで"Isolate is created."というメッセージを作り、メインとなっているUIのIsolateに送っています。
(メインのIsolateでしかUIは操作できないようです。)

Isolate間の通信にはReceivePortとSendPortを使います。
といってもSendPortはReceivePortを作ると自動的についてきます。
SendPortを使って情報を送ると、対応するReceivePortからその情報を読めるようになります。

SendPortはspawnUriで、子となるIsolateに送ることができます。
子IsolateでメインのIsolateに情報を送れるわけですね。

拍手[0回]

PR