下面的程序用于理解dart
中的isolates
。compute
方法被传递给派生的isolate。在compute
方法内部执行求和,但当使用List.generate
时,compute
函数不会完成执行,因为print("The total sum is : $sum");
语句从未被调用。
如果我们使用简单的for loop
(compute()
中的注解代码行),而不是使用List.generate
,则会计算并显示sum
。
import "dart:isolate";
void main(final List<String> args) async {
print("Entering main");
final model = ModelClass(35000, 100);
await Isolate.spawn<ModelClass>(compute, model);
print("Exiting main");
}
void compute(final ModelClass model) {
int sum = 0;
for (int value in List.generate(model.iteration, (index) => index)) {
sum += value * model.multiplier;
}
// for (int index = 0; index < model.iteration; index++) {
// sum += index * model.multiplier;
// }
print("The total sum is : $sum");
}
class ModelClass {
final int iteration;
final int multiplier;
ModelClass(this.iteration, this.multiplier);
}
为什么当我们使用List.generate
生成list
并迭代它时,compute
函数没有完成执行?
1条答案
按热度按时间ws51t4hk1#
你的问题是,下面的
await
并没有执行派生的Isolate
。相反,它只会在创建Isolate
本身时执行await
。在此之后,您的主
Isolate
没有其他事情可做,并且没有任何方式稍后被任何类型的事件(例如来自RecievePort
,Timer
或类似事件)触发。Dart将因此退出您的程序,因为您的程序执行仅依赖于邮件
Isolate
。请参阅以下答案,了解Dart程序何时停止和不停止的更详细描述:https://stackoverflow.com/a/70670962/1953515但简而言之,如果您希望在所有隔离完成执行后,首先停止程序,则需要让
main
隔离等待来自您衍生的隔离的一些答复。Flutter中的
compute()
函数就是这样做的,因为它被设计为在一个单独的Isolate
中运行给定的函数,然后将结果返回给调用者隔离。所以它会自动设置一个RecievePort
/SendPort
对。在Dart中,你可以用Dart 2.19中新引入的
Isolate.run
来做同样的事情:https://api.dart.dev/stable/2.19.6/dart-isolate/Isolate/run.html