您实际上可以创建任意数量的 ReceivePort,然后正如 Matt 所说,每个 ReceivePort 可以创建任意数量的 SendPort。
默认情况下,一个隔离,包括主隔离,有一个通过port
getter 创建和可用的 ReceivePort。此 ReceivePort 连接到从spawnFunction()
和返回的 SendPort spawnUri()
。但是您可以使用 创建一个新的 ReceivePort new ReceivePort()
,然后您可以通过创建任意数量的连接 SendPort toSendPort()
。要使用它们,您可以将新的 SendPort 本身与您从spawnFunction()
或通过的原始 SendPort 上的消息一起发送ReceivePort.receive()
。
通过这样做,您可以在两个隔离之间设置多个“通道”。我还没有玩过它,看看它在实践中是如何工作的,我一直在通过一个 SendPort 上的结构化消息多路复用通道。
请注意,您可以在任何隔离中创建 ReceivePort:父隔离或子隔离。因此,如果您希望该部分有两个发送端口给孩子,那么您需要一个来自spawnFunction()
另一个从孩子传回给父母的消息。
这是您的示例更改为使用多个发送端口。步骤:
- 主要:产生一个隔离
- main:使用 SendPort 发送消息,以便隔离可以发回消息
- echo:在隔离中创建第二个 ReceivePort
- echo:在隔离区中接收一条带有replyTo SendPort的消息
- echo:从 ReceivePort 创建一个 SendPort 并将其发回
- 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
哇!