问题
Dart 中的隔离是否会利用多核环境中的所有可用内核并行运行,还是会在单个内核上多路复用?
背景
Google将 Dart 编程语言中的隔离(单线程并发单元)描述为在主堆栈上运行的“轻量级线程”,不会阻塞。
因此,在我看来,它只能在单核上多路复用,而不能在 SMP、双核、多核或集群环境中的多个核上并行运行。
虽然,我找不到任何关于此的信息,因此我提出了一个谦虚的问题。
Dart 中的隔离是否会利用多核环境中的所有可用内核并行运行,还是会在单个内核上多路复用?
Google将 Dart 编程语言中的隔离(单线程并发单元)描述为在主堆栈上运行的“轻量级线程”,不会阻塞。
因此,在我看来,它只能在单核上多路复用,而不能在 SMP、双核、多核或集群环境中的多个核上并行运行。
虽然,我找不到任何关于此的信息,因此我提出了一个谦虚的问题。
也许。
dart:isolate 库指南指出:“隔离可能在单独的进程或线程中运行,具体取决于实现。对于 Web 应用程序,如果可用,隔离可以编译为 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");
});
}
独立的 dartvm将并行运行隔离,利用所有可用的内核。Dart 的浏览器实现可能会有所不同,具体取决于是否实现了 Web Worker。
这是 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");
});
}
我查了一下。隔离似乎是实际的线程。
隔离之间唯一可用的通信机制是传递消息。
非常好,除了
每个隔离区都有自己的堆,这意味着内存中的所有值(包括全局值)仅可用于该隔离区。
一点都不好,因为消息:
也可以发送对象实例(将在过程中复制
很坏。
这种方案似乎无法在不复制的情况下将大量数据从一个隔离区传递到另一个隔离区,因此消除了有效的隔离间通信。
我不会使用它,因为这种限制不允许按地址传递大对象/缓冲区,就像通常使用传统线程所做的那样。
起初它看起来很有趣,因为我几乎只使用消息传递设计,但他们坚持只使用私有堆来破坏线程间通信。