multithreading parallel-processing dart dart-isolates

multithreading - ¿Ejecutará Dart aislamientos en paralelo en un entorno de múltiples núcleos?



parallel-processing dart-isolates (3)

Pregunta

¿Los aislamientos en Dart se ejecutarán en paralelo utilizando todos los núcleos disponibles en un entorno núcleo múltiple, o se multiplexará en un solo núcleo?

Fondo

Google ha descrito aislamientos (una unidad de concurrencia de subproceso único) en el lenguaje de programación Dart como un "subproceso de peso ligero" que opera en la pila principal, sin bloqueo.

Por lo tanto, me parece que solo podrá multiplexarse ​​en un solo núcleo y no podrá ejecutarse en paralelo sobre múltiples núcleos en un entorno SMP, dualcore, multinúcleo o en clúster.

Sin embargo, no puedo encontrar ninguna información sobre esto, de ahí mi humilde pregunta.


Aquí está el código actualizado para 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"); }); }


Advertencia: el código siguiente no está actualizado y no funciona con Dart 1.0.

Respuesta corta

Tal vez.

Respuesta larga

La guía de la biblioteca dart: aislate establece: " Los aislamientos pueden ejecutarse en un proceso o subproceso independiente, dependiendo de la implementación. Para las aplicaciones web, los aislantes se pueden compilar a los trabajadores de la Web, si están disponibles. " (Énfasis mío)

Ejecutar este código y observar la carga de su CPU le dirá si su implementación lo hace o no.

#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"); }); }

El dartvm autónomo ejecutará aislamientos en paralelo, utilizando todos los núcleos disponibles. Las implementaciones del navegador de Dart probablemente variarán dependiendo de si Web Workers están implementados o no.


Lo busqué. Los aislados parecen ser hilos reales.

El único mecanismo disponible para comunicarse entre aislados es pasar mensajes.

Muy bien, excepto

Cada aislamiento tiene su propio montón, lo que significa que todos los valores en la memoria, incluidos los globales, están disponibles solo para ese aislamiento.

Nada bueno, debido a los mensajes:

también es posible enviar instancias de objetos (que se copiarían en el proceso)

Muy mal.

Este esquema parece imposibilitar la comunicación de grandes cantidades de datos de un aislado a otro sin copiarlo, eliminando así la comunicación eficiente entre los aislantes .

No lo usaría debido a esta restricción que impide el paso de objetos / búferes grandes por dirección, como normalmente haría con los hilos convencionales.

Parecía interesante al principio, porque uso casi exclusivamente diseños de paso de mensajes, pero manipularon las comunicaciones entre subprocesos al insistir solo en montones privados.