実際には、任意の数の ReceivePort を作成できます。次に、Matt が言ったように、ReceivePort ごとに任意の数の SendPort を作成できます。
デフォルトでは、メインのアイソレートを含むアイソレートには、作成された ReceivePort があり、portゲッターを介して使用できます。spawnFunction()この ReceivePort は、およびから返された SendPort に接続されspawnUri()ます。ただし、 で新しい ReceivePort をnew ReceivePort()作成してから、 を介して必要な数の接続された SendPort を作成できますtoSendPort()。それらを使用するには、新しい SendPort 自体を、 からspawnFunction()、または 経由で取得した元の SendPort のメッセージと共に送信しますReceivePort.receive()。
これにより、2 つの分離株の間に複数の「チャネル」を設定できます。これが実際にどのように機能するかをまだ確認していません。1 つの SendPort で構造化されたメッセージを介してチャネルを多重化しています。
ReceivePort は、親の Isolate または子の Isolate のいずれの Isolate でも作成できることに注意してください。したがって、親に子への 2 つの SendPort を持たせたい場合はspawnFunction()、メッセージで子から親に返される 1 つと、子から親に返される別の SendPort が必要です。
複数の SendPorts を使用するように変更した例を次に示します。手順:
- main: アイソレートをスポーンする
- main: アイソレートがメッセージを送り返すことができるように、SendPort を使用してメッセージを送信します。
- echo: 分離に 2 番目の ReceivePort を作成します
- echo: replyTo SendPort を使用して、isolate でメッセージを受信します
- echo: ReceivePort から SendPort を作成して送り返す
- main: echo からメッセージと SendPort を受け取る
main() には、Isolate への 2 つの独立した SendPort があります。
#import('dart:isolate');
echo() {
var port2 = new ReceivePort(); // 3
port2.receive((m, p) {
print("two: $m");
});
port.receive((m, p) { // 4
print("one: $m");
p.send("ack", port2.toSendPort()); // 5
});
}
main() {
port.receive((m, sendPort2) { // 6
sendPort2.send("hello 2");
});
var sendPort1 = spawnFunction(echo); // 1
sendPort1.send("hello 1", port.toSendPort()); // 2
}
これは以下を出力します:
one: hello 1
two: hello 2
うわー!