2012-09-17 36 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场。这也允许更紧凑的代码,因为不需要其他接收端口。

相关问题