Возможно ли инкапсулировать повторяющиеся отправки/ответы на один и тот же изолят дротика в рамках одной асинхронной функции?инкапсулировать повторенную отправку/ответы на один и тот же Dart-изолятор в пределах одной асинхронной функции
фона:
Для того, чтобы разработать удобный API, я хотел бы иметь функцию асинхронно возвращает результат, генерируемый изолята, например,
var ans = await askIsolate(isolateArgs);
Это прекрасно работает, если я непосредственно использовать ответ, генерируемый при вызове spawnUri, например
Future<String> askIsolate(Map<String,dynamic> isolateArgs) {
ReceivePort response = new ReceivePort();
var uri = Uri.parse(ISOLATE_URI);
Future<Isolate> remote = Isolate.spawnUri(uri, [JSON.encode(isolateArgs)], response.sendPort);
return remote.then((i) => response.first)
.catchError((e) { print("Failed to spawn isolate"); })
.then((msg) => msg.toString());
}
Недостатком описанного выше подхода, однако, заключается в том, что если мне нужно повторно позвонить askIsolate, в изолят должен появляться каждый раз.
Я бы хотел общаться с работающим изолятом, что, безусловно, возможно, если изоляция возвращает sendPort вызывающему. Но я считаю, что с 2013 Isolate refactoring это требует, чтобы вызывающий абонент прослушивал последующие сообщения на приемном устройстве, что делало невозможным инкапсуляцию внутри одной асинхронной функции.
Есть ли какой-то механизм для достижения этого, которого я не хватает?
Это в то время как я играл с изолятов. Предполагается, что https://pub.dartlang.org/packages/isolate предоставит хороший API для изоляции. Я предполагаю, что стоит поближе познакомиться. –
'IsolateRunner' в' package: isolate' предназначен для вызова функции в изолированном изоляторе более одного раза. Я думаю, что это сработает для этой проблемы: 'var runner = await IsolateRunner.spawn(); for (var arg in something)} {... await runner.run (queryFunction, arg); ...} await runner.close(); ' – lrn
Другой вариант заключается в том, что выполняется изоляция службы, но вместо того, чтобы каждый раз возвращать результат на один и тот же порт, каждый запрос может отправлять с ним свой собственный« SendPort ». Затем каждый запрос может создать «ResponsePort» и вернуть «first» getter для ответа: «Future askIsolate (isolateArgs)» {var p = new ReceivePort(); runningIsolatePort.send ([isolateArgs, p.sendPort]); return p.first; } '. – lrn