gpt4 book ai didi

asynchronous - 为什么 Future.timeout 在 dart 中不起作用?

转载 作者:行者123 更新时间:2023-12-03 08:32:17 28 4
gpt4 key购买 nike

我想要运行一个可能需要太长时间的计算。如果未在特定时间内完成,则中止计算并返回不同的值。对于这个问题,我发现 Future.timeout,它几乎会做我想要的同样的事情,除了它不适用于此代码

Future<String> timeoutTest() async
{
return await longComputation().timeout(
Duration(milliseconds: 10),
onTimeout: () => "Took too long"
);
}

Future<String> longComputation() async
{
int startTime = DateTime.now().millisecondsSinceEpoch;

Rational n = Rational.one;
for(int i = 1; i < 2000; i++)
{
n *= Rational.fromInt(i);
}
String result = n.toDecimalString();

print("Time took: ${DateTime.now().millisecondsSinceEpoch - startTime} ms");
return result;
}

当我调用 print(await timeoutTest()) 时,我要么期望一个需要最多 10ms 来计算的数字字符串,或者 < em>“Took too long” 字符串(如果花费超过 10 毫秒)。但我得到了数字字符串,以及控制台中的消息:“耗时:877 毫秒”。所以超时不起作用。

如果我使用 Future.delay 伪造计算,timeout 将按预期工作。它返回不同的值,因为longComputation至少花费了100ms。 (我仍然在控制台中收到消息:“耗时:103ms”,但这不是主要问题。)

Future<String> longComputation() async
{
int startTime = DateTime.now().millisecondsSinceEpoch;

String result = await Future.delayed(
Duration(milliseconds: 100),
() => "Fake computation result"
);

print("Time took: ${DateTime.now().millisecondsSinceEpoch - startTime} ms");
return result;
}

我假设我搞砸了 longComputation 中的某些内容,但是什么?没有未等待的 future

最佳答案

这种行为可能会令人困惑,但请务必记住,您的 Dart 代码仅在单个线程中执行(除非您使用隔离)。

问题在于 .timeout 背后的逻辑需要在同一个单线程中运行,并且 Dart 不能仅仅停止您自己的代码的执行。因此,如果您正在运行 CPU 密集型计算而没有任何暂停,则您将阻止 Dart VM 运行事件队列上的任何其他事件。

执行什么.timeout实际上,正在创建一个内部 Timer除非您在超时值之前得到结果,否则将来将会触发这些事件。这个Timer与 Dart VM 中的任何其他事件一样,事件位于事件队列的顶部。

但在您的第一个示例中,在您给出结果之前,我们实际上永远不会执行事件队列上的任何其他事件。所以从 Future从 的角度来看,您将在截止日期之前返回结果。

这看起来像 .timeout有点毫无意义,但它真正的用途是当您进行一些 IO 操作(例如 API 请求)时,Dart VM 实际上正在等待某些答案。

如果您打算使用它进行繁重的计算,您可以生成 Isolate所以你的主隔离实例可以等待另一个隔离。或者,您可以在计算中插入一些暂停,为 Dart VM 腾出空间来执行事件队列上的其他事件。例如插入 await Future<void>(() => null);这将在事件队列顶部生成一个新事件。当我们等待队列上的所有事件执行完之后我们自己的空计算。

然后添加一些逻辑也是有意义的,以便您自己的代码可以查看是否已达到超时值,以便您可以在这种情况下停止计算。

关于asynchronous - 为什么 Future.timeout 在 dart 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64834205/

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