Я действительно новичок в Дарте, а также в программировании. Я пытаюсь разработать программу в Dart с использованием изолятов. Мое намерение - сравнить его производительность снова в той же программе, но написано на Java с потоками.Как использовать результаты из разных изолятов в основном изоляте?
программадротик выглядит так до сих пор:
main.dart
import "dart:async"; import "dart:isolate"; main() { var rPort1 = new ReceivePort(); var rPort2 = new ReceivePort(); var p1 = 0; rPort1.listen((partial) { print("p1 ${partial}"); p1 = partial; rPort1.close(); }); var p2 = 0; rPort2.listen((partial) { print("p2 ${partial}"); p2 = partial; rPort2.close(); }); Isolate.spawnUri(new Uri.file("MyIsolate.dart"), [arg0, ...], rPort1.sendPort); Isolate.spawnUri(new Uri.file("MyIsolate.dart"), [arg0, ...], rPort2.sendPort); var p3 = p1 + p2; print("p3 ${p3}"); }
myIsolate.dart
import "dart:async"; import "dart:isolate"; main(args, SendPort port) { var partial = 0; // ... do stuff ... // args are used and partial is updated port.send(partial); }
Результат выглядит следующим образом:
p3 0
p1 -0.1168096561671553
p2 0.023709338284264223
Как вы можете видеть возвращаемые значения каждого изолировать приходит после того, как основной изолят закончил это исполнение. Я хочу использовать результат изолятов для дальнейшего расчета в основном.
Я не знаю, чего мне не хватает. Я уверен, что это очень глупо, но я не могу двигаться вперед по этой проблеме. В Java просто получить значение результата для каждого потока, но в Dart я не могу понять, как это сделать в изолятах.
Любые идеи?
Большое спасибо @Mike! Это было именно то, что я искал. Я тестировал hehre, и он работал как шарм :) – jlggross
На этой последней части 'Future.wait ([c1.future, c2.future]).then ((_) {...}); 'Я также добавил выражение ** await **, которое позволит мне продолжить выполнение в главном изоляте, как если бы я выполнял его синхронно. Таким образом, окончательный код выглядит следующим образом: 'await Future.wait ([c1.future, c2.future]). Then ((_) {...});'. – jlggross
Да, вы правы, я забыл поставить 'await' или' .then() 'там. Кстати, вам нужен только один из них, а не оба. Вы можете использовать 'await', а затем поместить зависимый код после него или использовать' .then() 'без' await', потому что они делают почти то же самое, только обработка ошибок немного отличается. – Mike