1つの非同期機能内で同じダーツ分離に繰り返し送信/応答をカプセル化することは可能ですか?単一の非同期機能内で同じ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以来、これは呼び出し側がreceivePort上の後続のメッセージを聞いて、単一の非同期関数内のカプセル化を不可能にすることを要求します。
これを達成するためのメカニズムはありますか?
は、それは私が分離株でプレイ中です。 https://pub.dartlang.org/packages/isolateは、分離するための素晴らしいAPIを提供することになっています。私は、それをもっと見る価値があると思います。 –
'package:isolate'の' IsolateRunner'は、スポーンされた隔離領域内の関数を複数回呼び出すためのものです。私はそれがこの問題のために働くと思います: 'var runner = IsolateRunner.spawn();を待ちます。 for(var arg something)} {... runner.run(queryFunction、arg);を待ちます。 ...} await runner.close(); ' – lrn
別のオプションは、サービスを分離して実行することですが、毎回同じポートで結果を返すのではなく、それぞれの要求が独自の' SendPort'を送ることができます。次に、各リクエストは 'ResponsePort'を作成し、レスポンスの' first' getterを返すことができます: 'Future askIsolate(isolateArgs){var p = new ReceivePort(); runningIsolatePort.send([isolateArgs、p.sendPort]); p.firstを返す。 } '。 – lrn