Dart隔离是否可以有多个发送和接收端口?

Dart隔离是否可以有多个发送和接收端口?,dart,dart-isolates,Dart,Dart Isolates,是否可以在Dart中为同一隔离打开多个发送和接收端口 例如,以下代码示例将创建两个隔离,每个隔离都有自己的发送端口。但是,我想知道是否有任何方法可以为同一个隔离创建多个发送/接收端口,并选择将消息发送到的接收端口 #import('dart:isolate'); echo() { } main() { var sendPort1 = spawnFunction(echo); var sendPort2 = spawnFunct

是否可以在Dart中为同一隔离打开多个发送和接收端口

例如,以下代码示例将创建两个隔离,每个隔离都有自己的发送端口。但是,我想知道是否有任何方法可以为同一个隔离创建多个发送/接收端口,并选择将消息发送到的接收端口

    #import('dart:isolate');

    echo() {

    }

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

虽然我不确定是否有多个接收端口。您可以为每个接收端口创建多个发送端口。此功能内置于ReceivePort类中:

如帮助底部所示:

从同一个ReceivePort创建多个发送端口是合法的


希望这有帮助。

虽然我不确定是否有多个接收端口。您可以为每个接收端口创建多个发送端口。此功能内置于ReceivePort类中:

如帮助底部所示:

从同一个ReceivePort创建多个发送端口是合法的


希望这能有所帮助。

您实际上可以创建任意数量的ReceivePort,然后正如Matt所说,每个ReceivePort可以创建任意数量的发送端口

默认情况下,一个隔离(包括主隔离)创建了一个ReceivePort,并可通过
端口
getter使用。此接收端口连接到从
spawnfort()
spawnUri()
返回的发送端口。但是您可以使用
new ReceivePort()
创建一个新的接收端口,然后您可以通过
toSendPort()
创建任意数量的连接发送端口。要使用它们,您可以将新的发送端口本身与原始发送端口上的消息一起发送,这些消息可以从
spawnFunction()
,也可以通过
ReceivePort.receive()

通过这样做,您可以在两个隔离之间设置多个“通道”。我还没有玩过它来看看它在实践中是如何工作的,我一直在通过一个发送端口上的结构化消息多路复用通道

请注意,您可以在任何隔离中创建ReceivePort:父隔离或子隔离。因此,如果希望partent有两个到子级的发送端口,则需要一个来自
spawnFunction()
的发送端口,另一个通过消息从子级传回父级

下面是更改为使用多个发送端口的示例。步骤如下:

  • 主要:繁殖一个隔离体
  • main:使用发送端口发送消息,以便隔离服务器可以发回消息
  • echo:在隔离中创建第二个ReceivePort
  • echo:在隔离中接收消息,并使用replyTo发送端口
  • echo:从ReceivePort创建一个发送端口并将其发送回
  • main:从echo接收消息和发送端口
  • 现在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
    

    实际上,您可以创建任意数量的接收端口,然后如Matt所说,每个接收端口可以创建任意数量的发送端口

    默认情况下,一个隔离(包括主隔离)创建了一个ReceivePort,并可通过
    端口
    getter使用。此接收端口连接到从
    spawnfort()
    spawnUri()
    返回的发送端口。但是您可以使用
    new ReceivePort()
    创建一个新的接收端口,然后您可以通过
    toSendPort()
    创建任意数量的连接发送端口。要使用它们,您可以将新的发送端口本身与原始发送端口上的消息一起发送,这些消息可以从
    spawnFunction()
    ,也可以通过
    ReceivePort.receive()

    通过这样做,您可以在两个隔离之间设置多个“通道”。我还没有玩过它来看看它在实践中是如何工作的,我一直在通过一个发送端口上的结构化消息多路复用通道

    请注意,您可以在任何隔离中创建ReceivePort:父隔离或子隔离。因此,如果希望partent有两个到子级的发送端口,则需要一个来自
    spawnFunction()
    的发送端口,另一个通过消息从子级传回父级

    下面是更改为使用多个发送端口的示例。步骤如下:

  • 主要:繁殖一个隔离体
  • main:使用发送端口发送消息,以便隔离服务器可以发回消息
  • echo:在隔离中创建第二个ReceivePort
  • echo:在隔离中接收消息,并使用replyTo发送端口
  • echo:从ReceivePort创建一个发送端口并将其发送回
  • main:从echo接收消息和发送端口
  • 现在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
    

    贾斯汀的回答基本上是正确的,但给我带来了一些麻烦,因为在执行步骤5后,隔离停止了响应。下面是一个在我的环境中实际起作用的更新版本:

    导入“省道:隔离”;
    回声(){
    var port2=新接收端口();
    端口2.接收((m,p){
    印刷品(“两份:$m”);
    });
    接收端口((m,p){
    印刷品(一张:$m);
    p、 发送(port2.toSendPort());
    });
    }
    main(){
    var sendPort1=生成函数(echo);
    sendPort1.call(“hello 1”)。然后((newPort)=>newPort.send(“hello 2”);
    }
    

    主要区别只是端口作为消息发送,而不是使用replyTo字段。由于不需要另一个接收端口,这也允许使用更紧凑的代码。

    Justin的回答基本正确,但给我带来了一些麻烦,因为在执行步骤5后,隔离停止响应。下面是一个在我的环境中实际起作用的更新版本:

    导入“省道:隔离”;
    回声(){
    var port2=新接收端口();
    端口2.接收((m,p){
    印刷品(“两份:$m”);
    });
    接收端口((m,p){
    印刷品(一张:$m);
    p、 发送(port2.toSendPort());
    });
    }
    main(){
    var sendPort1=生成函数(echo);
    sendPort1.call(“hello 1”)。然后((newPort)=>newPort.send(“hello 2”);
    }
    
    主要区别在于端口是作为消息发送的,而不是作为消息发送的