21

質問

Dart の分離は、複数のコア環境で利用可能なすべてのコアを利用して並行して実行されますか、それとも単一のコアで多重化されますか?

バックグラウンド

Google は、Dart プログラミング言語のアイソレート(単一スレッドの同時実行単位) を、ブロックせずにメイン スタックで動作する「軽量スレッド」と説明しています。

したがって、単一のコアでしか多重化できず、SMP、デュアルコア、マルチコア、またはクラスター化された環境で複数のコアで並列に実行できないように思えます。

ただし、これに関する情報が見つからないため、謙虚な質問です。

4

3 に答える 3

15

警告: 以下のコードは古くなっているため、Dart 1.0 では動作しません。

簡潔な答え

多分。

長い答え

dart:isolate ライブラリ ガイド次のように記載されています

このコードを実行して CPU 負荷を観察すると、実装がこれを行っているかどうかがわかります。

#import('dart:isolate');
main() {
  for (var tmp = 0; tmp < 5; ++tmp) {
    SendPort sendPort = spawnFunction(runInIsolate);
    sendPort.call(tmp).then((reply) {
      print(reply);
    });
  }
}

runInIsolate() {
  port.receive((msg, SendPort reply) {
    var k = 0;
    var max = (5 - msg) * 100000000; 
    for (var i = 0; i < max; ++i) {
        i = ++i - 1;
        k = i;
    }
    reply.send("I received: $msg and calculated $k");
  });
}

スタンドアロンの dartvm、利用可能なすべてのコアを利用して、Isolate を並行して実行します。Dart のブラウザー実装は、Web ワーカーが実装されているかどうかによって異なる可能性があります。

于 2012-07-06T14:48:26.800 に答える
8

Dart 1.0 の更新されたコードは次のとおりです。

import 'dart:isolate';

main() {
  int counter = 0;

  ReceivePort receivePort = new ReceivePort();

  receivePort.listen((msg) {
    if (msg is SendPort) {
      msg.send(counter++);
    } else {
      print(msg);
    }
  });

  for (var i = 0; i < 5; i++) {
    Isolate.spawn(runInIsolate, receivePort.sendPort);
  }
}

runInIsolate(SendPort sendPort) {
  ReceivePort receivePort = new ReceivePort();
  sendPort.send(receivePort.sendPort);

  receivePort.listen((msg) {
    var k = 0;
    var max = (5 - msg) * 100000000; 
    for (var i = 0; i < max; ++i) {
        i = ++i - 1;
        k = i;
    }
    sendPort.send("I received: $msg and calculated $k");
  });
}
于 2014-01-20T05:44:41.223 に答える
4

調べてみました。分離株は実際のスレッドのようです。

アイソレート間の通信に使用できる唯一のメカニズムは、メッセージを渡すことです。

非常に良い

各分離には独自のヒープがあります。つまり、グローバルを含むメモリ内のすべての値は、その分離にのみ使用できます。

メッセージのために、まったく良くありません:

オブジェクト インスタンスを送信することもできます (プロセスでコピーされます)。

ひどい。

この方式では、大量のデータをコピーせずにあるアイソレートから別のアイソレートに通信することが不可能になるように思われるため、効率的なアイソレート間の通信ができなくなります。

従来のスレッドで通常行うように、大きなオブジェクト/バッファーをアドレスで渡すことを禁止するこの制限のため、私はそれを使用しません。

最初は面白そうに見えました。なぜなら、私はメッセージ パッシング デザインをほぼ独占的に使用していたからです。ただし、プライベート ヒープのみを主張することで、スレッド間通信を壊してしまいました。

于 2012-07-06T14:32:51.887 に答える