1

Dart で同じ Isolate に対して複数の送受信ポートを開くことは可能ですか?

たとえば、次のコード サンプルは、それぞれが独自の送信ポートを持つ 2 つの分離を作成します。ただし、同じ分離用に複数の送受信ポートを作成し、メッセージの送信先の受信ポートを選択する方法があるかどうか疑問に思っていました。

    #import('dart:isolate');

    echo() {

    }

    main() {
        var sendPort1 = spawnFunction(echo);
        var sendPort2 = spawnFunction(echo);
    }
4

3 に答える 3

4

実際には、任意の数の 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 を使用するように変更した例を次に示します。手順:

  1. main: アイソレートをスポーンする
  2. main: アイソレートがメッセージを送り返すことができるように、SendPort を使用してメッセージを送信します。
  3. echo: 分離に 2 番目の ReceivePort を作成します
  4. echo: replyTo SendPort を使用して、isolate でメッセージを受信します
  5. echo: ReceivePort から SendPort を作成して送り返す
  6. 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

うわー!

于 2012-09-19T20:35:53.047 に答える
1

複数の受信ポートについてはわかりませんが。受信ポートごとに複数の送信ポートを作成できます。この機能は、ReceivePort クラスに組み込まれています: ReceivePort.toSendPort

ヘルプの下部に示されているように:

同じ ReceivePort から複数の SendPort を作成することは合法です。

お役に立てれば。

于 2012-09-19T18:14:31.840 に答える