我需要按顺序计算~10k长时间运行的任务。我决定为此目的使用Isolates。 问题是我应该每次为每个单独的任务创建spawn Isolate,还是应该为所有任务创建一个Isolate'执行。我不知道创建Isolates有多昂贵。
创建一个孤立的源并将其用于所有任务:
import 'dart:isolate';
class DataPacket {
SendPort port;
int result;
}
class SquareRootCalculator {
final ReceivePort _masterPort = new ReceivePort();
SendPort _workerPort;
SquareRootCalculator() {
Isolate.spawn(isolateFunction, _masterPort.sendPort).then((isolate) {
_masterPort.listen((data) {
if (_workerPort == null)
_workerPort = data.port;
else {
print(data.toString());
}
});
});
}
input(int n) {
_workerPort.send(n);
}
}
void isolateFunction(SendPort masterPort) {
ReceivePort _workerPort = new ReceivePort();
DataPacket packet = new DataPacket();
packet.port = _workerPort.sendPort;
packet.result = -1;
masterPort.send(packet);
_workerPort.listen((data) {
int out = calculate(data);
DataPacket packet = new DataPacket();
packet.port = _workerPort.sendPort;
packet.result = out;
masterPort.send(packet);
});
}
int calculate(int number) {
for (var i = 0; i < 1000000000; ++i) {} // long running task
return number * number;
}
我可以推动任务
SquareRootCalculator _calc = new SquareRootCalculator();
for(int i = 0; i < 100; ++i){
_calc.input(i); //task
sleep(const Duration(seconds:1));
}
答案 0 :(得分:2)
如果你创造很多东西,创建隔离物是相当昂贵的。
我绝对建议只使用SendPort
/ ReceivePort
创建一个并推送一个任务。