首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Isolate处理大量任务

使用Isolate处理大量任务
EN

Stack Overflow用户
提问于 2018-05-18 01:17:46
回答 1查看 650关注 0票数 4

我有大约10k个长时间运行的任务需要按顺序计算。为此,我决定使用隔离。问题是,我是应该为每个单独的任务每次都创建产卵隔离,还是应该为所有任务的执行只创建一个隔离。我不知道创建隔离有多昂贵。

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

代码语言:javascript
复制
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;
}

我可以推送任务

代码语言:javascript
复制
 SquareRootCalculator _calc = new SquareRootCalculator();

 for(int i = 0; i < 100; ++i){
    _calc.input(i); //task
    sleep(const Duration(seconds:1));
  }
EN

回答 1

Stack Overflow用户

发布于 2018-05-18 01:20:37

如果你创建了大量的隔离,那么创建隔离的代价是相当高的。

我绝对建议只创建一个任务,并使用SendPort/ReceivePort一个接一个地推送任务。

如果您希望并行运行固定数量的隔离(少于任务数量),https://pub.dartlang.org/packages/pool可以提供帮助。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50397143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档