1

是否可以在 Dart 中为同一个 Isolate 打开多个发送和接收端口?

例如,以下代码示例将创建两个隔离区,每个隔离区都有自己的发送端口。但是,我想知道是否有任何方法可以为同一个隔离创建多个发送/接收端口并选择接收端口来发送消息。

    #import('dart:isolate');

    echo() {

    }

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

3 回答 3

4

您实际上可以创建任意数量的 ReceivePort,然后正如 Matt 所说,每个 ReceivePort 可以创建任意数量的 SendPort。

默认情况下,一个隔离,包括主隔离,有一个通过portgetter 创建和可用的 ReceivePort。此 ReceivePort 连接到从spawnFunction()和返回的 SendPort spawnUri()。但是您可以使用 创建一个新的 ReceivePort new ReceivePort(),然后您可以通过创建任意数量的连接 SendPort toSendPort()。要使用它们,您可以将新的 SendPort 本身与您从spawnFunction()或通过的原始 SendPort 上的消息一起发送ReceivePort.receive()

通过这样做,您可以在两个隔离之间设置多个“通道”。我还没有玩过它,看看它在实践中是如何工作的,我一直在通过一个 SendPort 上的结构化消息多路复用通道。

请注意,您可以在任何隔离中创建 ReceivePort:父隔离或子隔离。因此,如果您希望该部分有两个发送端口给孩子,那么您需要一个来自spawnFunction()另一个从孩子传回给父母的消息。

这是您的示例更改为使用多个发送端口。步骤:

  1. 主要:产生一个隔离
  2. main:使用 SendPort 发送消息,以便隔离可以发回消息
  3. echo:在隔离中创建第二个 ReceivePort
  4. echo:在隔离区中接收一条带有replyTo SendPort的消息
  5. echo:从 ReceivePort 创建一个 SendPort 并将其发回
  6. main:从echo接收消息和SendPort

现在 main() 有两个独立的发送端口到隔离。

#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 回答
0

贾斯汀的回答基本上是对的,但给我带来了一些麻烦,因为执行步骤 5 后隔离停止响应。所以这是一个在我的上下文中实际工作的更新版本:

import 'dart:isolate';

echo() {
  var port2 = new ReceivePort();

  port2.receive((m, p) {
    print("two: $m");
  });

  port.receive((m, p) {
    print("one: $m");
    p.send(port2.toSendPort());
  });
}

main() {
  var sendPort1 = spawnFunction(echo);
  sendPort1.call("hello 1").then((newPort)=>newPort.send("hello 2"));
}

主要区别只是端口作为消息发送,而不是使用 replyTo 字段。这也允许更紧凑的代码,因为不需要其他接收端口。

于 2013-08-27T13:20:29.593 回答