gpt4 book ai didi

asynchronous - Dart :io clean up Futures that timeout? 是怎么回事

转载 作者:行者123 更新时间:2023-12-03 02:57:11 29 4
gpt4 key购买 nike

假设我们使用配置了超时的 http 包从 dart:io 应用程序发出 HTTP 请求:

dynamic getSomething(String url) async {
try {
var response = await http.get(url).timeout(new Duration(seconds: 30));
return JSON.decode(response.body);
} catch (_) {
return null;
}
}

这里有两个future,一个由http.get(请求Future)生成,另一个由Future.timeout(超时Future)生成。如果请求 Future 完成,
它的值被传递到超时 Future ,这反过来又完成了。那挺好的。

但是,如果 http.get 未在 30 秒内完成,则超时 future 将完成并抛出 TimeoutException。请求 Future 会发生什么?
当然,与请求 Future 相关的一些状态和内存分配并没有通过运行超时 Future 来专门清理。更糟糕的是,
如果请求 Future 在超时后完成,该代码仍将执行。超时Future是否有责任专门取消请求-
在这种情况下,这是不可能的,因为它被埋在包装中 - 或者是否有其他必须使用的机制?

更一般地说,一个永远不会完成的 Future 是否最终会清理它的状态和内存,或者它会永远挂起?

最佳答案

当没有对它的引用时,Future 将被垃圾收集,就像任何其他变量一样。 Future 变量在本质上没有什么不同。例如,它们不是操作系统构造。

在您的 http 示例中,超时 Future 与原始 Future 链接,因此如果原始 Future 完成,则超时 Future 也将完成。在相反的情况下,超时触发,http 操作将持有对原始 future 的引用(它持有对超时 future 的引用),直到 http 操作完成。因此,Futures 可能泄漏的唯一方法是如果 http 请求从未返回,但此时您正在泄漏 http 连接,并且您遇到的问题比泄漏几个 Futures 更大。

请注意,超时 Future 完成的事实并不意味着存在错误。错误的行为不同。错误会导致 Future 调用 catchError() 或调用您的回调。

关于asynchronous - Dart :io clean up Futures that timeout? 是怎么回事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36554233/

29 4 0