2012-09-17 38 views
1

是否可以在Dart中爲同一隔離器打開多個發送和接收端口?Dart Isolates可以有多個發送和接收端口嗎?

E.g.以下代碼示例將創建兩個分離器,每個分離器都有自己的發送端口。然而,我想知道是否有辦法爲同一個隔離器創建多個發送/接收端口,並選擇接收端口發送消息。

#import('dart:isolate'); 

    echo() { 

    } 

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

你能澄清從同一個隔離區的兩個SendPorts將被使用在哪裏嗎?你能否簡單地將'sendPort'傳遞給需要傳遞給隔離的任何類或函數? –

回答

1

雖然我不確定多個接收端口。您可以爲每個接收端口創建多個發送端口。此功能是建立到ReceivePort類:ReceivePort.toSendPort

截至的幫助下表示:

是合法的來自同一ReceivePort創建多個SendPorts。

希望這會有所幫助。

3

實際上,您可以創建任意數量的ReceivePort,然後按照Matt的說法,爲每個ReceivePort創建任意數量的SendPort。

默認情況下,隔離區(包括主隔離區)具有通過port獲取方創建並可用的接收端口。此接收端口連接到從spawnFunction()spawnUri()返回的SendPort。但是您可以創建一個新的接收端口new ReceivePort(),然後您可以通過toSendPort()創建任意數量的連接SendPort。要使用它們,您需要發送新的SendPort本身以及您從spawnFunction()ReceivePort.receive()獲得的原始SendPort上的消息。

通過這樣做,您可以在兩個菌株之間設置多個「通道」。我還沒有玩過它,但還沒有看到它是如何工作的,我已經通過一個SendPort上的結構化消息複用了頻道。

請注意,您可以在任何隔離區中創建ReceivePort:父隔離區或子隔離區。所以如果你想讓這個partent有兩個SendPort給這個孩子,那麼你需要從spawnFunction()中得到一個,並且從另一個孩子回傳給父母。

以下是您的示例更改爲使用多個SendPort。以下步驟:

  1. 主:產卵的分離物
  2. 主:發送一個消息與一個發送端口,使得可將該分離消息發送回
  3. 回聲:在該分離物
  4. 回波創建第二ReceivePort :在與發送端口的replyTo
  5. 回波的分離接收消息:創建從一個ReceivePort發送端口和發送回
  6. 主:從回聲
  7. 接收消息和發送端口

現在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 

呼!

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場。這也允許更緊湊的代碼,因爲不需要其他接收端口。

相關問題