Обработка большого количества задач с помощью Isolate

У меня есть ~ 10 тысяч длительно выполняемых задач, которые мне нужно вычислять последовательно. Я решил использовать для этого изоляты. Вопрос в том, должен ли я создавать Spawn Isolate каждый раз для каждой отдельной задачи или я должен создавать только один Isolate для выполнения всех задач. Я не знаю, насколько дорого обходится создание Изолятов.

Исходный код для создания одного изолята и использования его для всех задач:

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

person Anil8753    schedule 17.05.2018    source источник


Ответы (1)


Создание изолятов довольно дорогое, если вы создаете много.

Я определенно предлагаю создать только одну и продвигать одну задачу за другой, используя _1 _ / _ 2_.

https://pub.dartlang.org/packages/pool может помочь, если вам нужен фиксированный номер изолятов (меньше количества задач) выполняются параллельно.

person Günter Zöchbauer    schedule 17.05.2018