gpt4 book ai didi

dart - 如何在主分离株中使用不同分离株的结果?

转载 作者:行者123 更新时间:2023-12-03 02:51:17 24 4
gpt4 key购买 nike

我对 Dart 和编程都很陌生。我正在尝试使用隔离在 Dart 中开发一个命令行程序。我的目的是将它的性能与同一个程序进行比较,但用 Java 编写并带有线程。

到目前为止,Dart 程序如下所示:

  1. main.dart

    import "dart:async";
    import "dart:isolate";

    main() {
    var rPort1 = new ReceivePort();
    var rPort2 = new ReceivePort();

    var p1 = 0;
    rPort1.listen((partial) {
    print("p1 ${partial}");
    p1 = partial;
    rPort1.close();
    });
    var p2 = 0;
    rPort2.listen((partial) {
    print("p2 ${partial}");
    p2 = partial;
    rPort2.close();
    });

    Isolate.spawnUri(new Uri.file("MyIsolate.dart"), [arg0, ...], rPort1.sendPort);
    Isolate.spawnUri(new Uri.file("MyIsolate.dart"), [arg0, ...], rPort2.sendPort);

    var p3 = p1 + p2;
    print("p3 ${p3}");
    }
  2. myIsolate.dart

    import "dart:async";
    import "dart:isolate";

    main(args, SendPort port) {
    var partial = 0;
    // ... do stuff ...
    // args are used and partial is updated
    port.send(partial);
    }

输出看起来像这样:

p3 0
p1 -0.1168096561671553
p2 0.023709338284264223

如您所见,每个 isolate 的返回值都在 ma​​in isolate 完成执行后出现。我想要的是使用 isolates 的结果在 main 中进一步计算。

我不知道我错过了什么。我确定这是非常愚蠢的事情,但我无法在这个问题上取得进展。在 Java 中获取每个线程的结果值很简单,但在 Dart 中我不知道如何单独执行此操作。

有什么想法吗?

最佳答案

您必须等到所有流(来自您的端口)都完成。这样做的一种方法是这样的:

import "dart:async";
import "dart:isolate";

main() {
var rPort1 = new ReceivePort();
var rPort2 = new ReceivePort();

// Defining completers which would complete when Streams are finished
Completer c1 = new Completer();
Completer c2 = new Completer();

var p1 = 0;
rPort1.listen((partial) {
print("p1 ${partial}");
p1 = partial;
rPort1.close();
}, onDone: ()=>c1.complete()); // Notice onDone callback here
var p2 = 0;
rPort2.listen((partial) {
print("p2 ${partial}");
p2 = partial;
rPort2.close();

}, onDone: ()=>c2.complete()); // And here

Isolate.spawnUri(new Uri.file("my_isolate.dart"), [0], rPort1.sendPort);
Isolate.spawnUri(new Uri.file("my_isolate.dart"), [0], rPort2.sendPort);

// Waiting for both streams to complete before summing our results
Future.wait([c1.future,c2.future]).then((_){
var p3 = p1 + p2;
print("p3 ${p3}");
});
}

对于您的任务,如果您正在等待确切的值,您可以只为您需要的这些值定义 Futures,并在不等待您的隔离(及其流)完成的情况下完成它们。

为此,只需移动 c*.complete(<value>)相应的 listen() 回调。类似的东西(未测试):

rPort1.listen((partial) {
print("p1 ${partial}");
c1.complete(partial);
rPort1.close();
});
rPort2.listen((partial) {
print("p2 ${partial}");
c2.complete(partial);
rPort2.close();
});

...

Future.wait([c1.future,c2.future]).then((result){
var p3 = result[0] + result[1];
print("p3 ${p3}");
});

关于dart - 如何在主分离株中使用不同分离株的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31013229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com