Flutter 使用隔离处理大量任务

Flutter 使用隔离处理大量任务,flutter,dart,dart-isolates,Flutter,Dart,Dart Isolates,我有大约10k个长时间运行的任务需要按顺序计算。我决定为此目的使用隔离剂。 问题是我应该每次为每个任务创建一个生成隔离,还是应该为所有任务的执行只创建一个隔离。我不知道制造隔离物有多贵 Source创建一个隔离并将其用于所有任务: import 'dart:isolate'; class DataPacket { SendPort port; int result; } class SquareRootCalculator { final ReceivePort _master

我有大约10k个长时间运行的任务需要按顺序计算。我决定为此目的使用隔离剂。 问题是我应该每次为每个任务创建一个生成隔离,还是应该为所有任务的执行只创建一个隔离。我不知道制造隔离物有多贵

Source创建一个隔离并将其用于所有任务:

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;
}
导入“省道:隔离”;
类数据包{
发送端口;
int结果;
}
类平方根计算器{
最终接收端口_masterPort=新接收端口();
发送端口(工作端口),;
平方根计算器(){
隔离.spawn(隔离函数,_masterPort.sendPort)。然后((隔离){
_masterPort.listen((数据){
如果(_workerPort==null)
_workerPort=data.port;
否则{
打印(data.toString());
}
});
});
}
输入(整数n){
_workerPort.send(n);
}
}
无效隔离功能(发送端口主端口){
ReceivePort _workerPort=new ReceivePort();
数据包=新数据包();
packet.port=\u workerPort.sendPort;
packet.result=-1;
主端口发送(数据包);
_workerPort.listen((数据){
int out=计算(数据);
数据包=新数据包();
packet.port=\u workerPort.sendPort;
packet.result=out;
主端口发送(数据包);
});
}
整数计算(整数){
对于(var i=0;i<100000000;++i){}//长时间运行的任务
返回编号*编号;
}
我可以推动任务

 SquareRootCalculator _calc = new SquareRootCalculator();

 for(int i = 0; i < 100; ++i){
    _calc.input(i); //task
    sleep(const Duration(seconds:1));
  }
SquareRootCalculator\u calc=new SquareRootCalculator();
对于(int i=0;i<100;++i){
_计算输入(i);//任务
睡眠(持续时间(秒:1));
}

如果你创建了很多,那么创建隔离是相当昂贵的

我绝对建议只创建一个任务,然后使用
SendPort
/
ReceivePort
逐个推送一个任务

如果您希望固定数量的隔离(低于任务数量)并行运行,则可以提供帮助