Dart会在多核环境中并行执行隔离吗?

Aro*_*olm 16 parallel-processing multithreading dart dart-isolates

Dart中的隔离区是否会利用多核环境中的所有可用内核并行运行,还是会在单个内核上进行多路复用?

背景

谷歌已经将Dart编程语言中的隔离(单线程并发单元)描述为一个"轻量级线程",它在主堆栈上运行,没有阻塞.

因此,在我看来,它只能在单个内核上进行多路复用,并且无法在SMP,双核,多核或集群环境中的多个内核上并行运行.

虽然,我找不到任何关于此的信息,因此我的谦虚问题.

Aro*_*olm 13

警告:以下代码已过期,不适用于Dart 1.0.

简短的回答

也许.

答案很长

镖:隔离库指南指出:" 可能.在一个单独的进程或线程运行,取决于实施对于Web应用程序,隔离可以编译为网络工作者,如果它们可用 "(我的重点)

运行此代码并观察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");
  });
}
Run Code Online (Sandbox Code Playgroud)

独立的dartvm 利用所有可用内核并行运行隔离.Dart的浏览器实现可能会有所不同,具体取决于是否实现了Web Workers.


Set*_*add 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");
  });
}
Run Code Online (Sandbox Code Playgroud)

  • Dartvm是否并行运行隔离?它能够使用所有可用的核心吗? (4认同)