実際には、任意の数の 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
うわー!