實際上,您可以創建任意數量的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'傳遞給需要傳遞給隔離的任何類或函數? –