实际上,您可以创建任意数量的ReceivePort,然后按照Matt的说法,为每个ReceivePort创建任意数量的SendPort。
默认情况下,隔离区(包括主隔离区)具有通过port
获取方创建并可用的接收端口。此接收端口连接到从spawnFunction()
和spawnUri()
返回的SendPort。但是您可以创建一个新的接收端口new ReceivePort()
,然后您可以通过toSendPort()
创建任意数量的连接SendPort。要使用它们,您需要发送新的SendPort本身以及您从spawnFunction()
或ReceivePort.receive()
获得的原始SendPort上的消息。
通过这样做,您可以在两个菌株之间设置多个“通道”。我还没有玩过它,但还没有看到它是如何工作的,我已经通过一个SendPort上的结构化消息复用了频道。
请注意,您可以在任何隔离区中创建ReceivePort:父隔离区或子隔离区。所以如果你想让这个partent有两个SendPort给这个孩子,那么你需要从spawnFunction()
中得到一个,并且从另一个孩子回传给父母。
以下是您的示例更改为使用多个SendPort。以下步骤:
- 主:产卵的分离物
- 主:发送一个消息与一个发送端口,使得可将该分离消息发送回
- 回声:在该分离物
- 回波创建第二ReceivePort :在与发送端口的replyTo
- 回波的分离接收消息:创建从一个ReceivePort发送端口和发送回
- 主:从回声
接收消息和发送端口
现在main()有两个独立的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
呼!
你能澄清从同一个隔离区的两个SendPorts将被使用在哪里吗?你能否简单地将'sendPort'传递给需要传递给隔离的任何类或函数? –