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

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

    #import('dart:isolate');

    echo() {

    }

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

#1楼 票数:3

实际上你可以创建任意数量的ReceivePort,然后就Matt所说,每个ReceivePort可以有任意数量的SendPort。

默认情况下,隔离(包括主隔离)具有通过port getter创建并可用的ReceivePort。 此ReceivePort连接到从spawnFunction()spawnUri()返回的spawnFunction() 但是您可以使用new ReceivePort()创建一个新的ReceivePort,然后您可以通过toSendPort()创建任意数量的连接SendPort。 要使用它们,您可以发送新的SendPort本身以及您从spawnFunction()或通过ReceivePort.receive()获得的原始SendPort上的消息。

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

请注意,您可以在任何隔离中创建ReceivePort:父隔离或子隔离。 因此,如果您希望partent为子节点提供两个SendPort,那么您需要一个来自spawnFunction()另一个,以及另一个从子节点传递回消息中的父节点。

这是您的示例更改为使用多个SendPorts。 步骤:

  1. 主要:产生一个孤立
  2. main:使用SendPort发送消息,以便隔离可以发回消息
  3. echo:在隔离中创建第二个ReceivePort
  4. echo:使用replyTo SendPort在隔离区中接收消息
  5. echo:从ReceivePort创建一个SendPort并将其发回
  6. main:从echo接收消息和SendPort

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

呼!

#2楼 票数:1 已采纳

虽然我不确定多个接收端口。 您可以为每个接收端口创建多个发送端口。 此功能构建在ReceivePort类中: ReceivePort.toSendPort

如帮助底部所示:

从同一个ReceivePort创建多个SendPort是合法的。

希望这可以帮助。

#3楼 票数:0

Justin的答案基本上是正确的,但是由于隔离区在执行完第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字段。 这也允许更紧凑的代码,因为不需要其他接收端口。

  ask by Arun Ambupe translate from so

未解决问题?本站智能推荐:

1回复

为什么 Dart 隔离中的流在没有接收端口的情况下不起作用

当我尝试在隔离中使用流时,我遇到了一个奇怪的问题,如果我尝试这样的操作 控制台没有打印任何内容,但是如果我在 main 方法中添加接收端口,它工作正常,即使我不使用接收端口 这是一个错误还是我有什么问题?
1回复

在后台 flutter 应用程序在它停止工作后仅工作 1 分钟,Dart-Isolates 是否适合尝试?

制作了一个带有摇动包的简单计数器应用程序,通过摇动手机来增加计数器变量,当应用程序在前面运行(处于活动状态)时效果很好,但一分钟后打开其他应用程序会停止此摇动功能,它只能工作一分钟,但不能一分钟后,我试图实现隔离,但我不能这样做,如果有人能告诉我如何在下面的代码中实现隔离,我将非常感谢他,谢谢 代码
1回复

如何处理 Isolates 中抛出的异常?

我正在试验 Dart 并使用新的streamSpawnFunction创建一个新的隔离。 我在 Dartium 中运行我的代码,但我注意到如果在隔离中发生某种不可恢复的错误,我不会在控制台上收到任何错误消息。 因为隔离代码中的断点不起作用调试真的很痛苦。 旧的基于端口的 Isolate spaw
1回复

两个隔离通过端口发送消息会丢弃一些 dart 2.5 版本的消息

如果我从一个隔离向主隔离发送消息,则主无法接收完整的消息。 我的测试代码被炸毁了: 如果我每秒发送消息,没关系,所以频率会影响主隔离接收消息,如果主隔离很忙,它会丢弃消息吗? 端口是否使用消息队列相互通信? 它是同步还是异步?
2回复

使用IndexedDB在Isolates之间共享内存

我现在正在使用Isolates,并想知道使用IndexedDB在Isolates之间共享数据是否是一种很好的沟通方式? 具体来说,我希望一个Isolate能够写入它,然后告诉其他Isolates他们可能只读它。 这是一旦写入就被认为是不变的数据并且相当大。 我想这样做的主要原因是因为我不想
1回复

Dart多服务器中的端口转发请求//隔离处理程序

如果我有4个Dart Server正在运行,并且我想转发请求,我该如何在Dart中做到这一点? 一方面,我希望对请求进行有效的反应,但又能够以不同的方式处理某些请求,或者处理某城市的IP。 因此,我评估了一个会话ID,并说此会话应由server2:1234进行服务,这意味着理想情况下,响应将
1回复

Dart 隔离调用或发送

我有几个关于隔离如何工作的问题: 1) call和send和我什么时候应该使用call over send什么区别? 2)只是好奇,有没有办法像我们链接Future一样链接隔离? 3) import 'dart:isolate'; echo() { port.receive((msg
3回复

在单个异步函数中将重复发送/响应封装到同一Dart隔离中

是否可以在单个异步函数中将重复发送/响应封装到相同的dart隔离中? 背景: 为了设计一个方便的API,我想让一个函数异步返回由隔离产生的结果,例如 如果我直接使用spawnUri调用生成的响应,则可以正常工作,例如 但是,上述方法的缺点是,如果我需要重复调​​用as