flutter - flutter 在什么线程/隔离上运行 IO 操作?

标签 flutter dart dart-isolates

例如在flutter中使用http包或进行一般IO操作时

import 'package:http/http.dart' as http;

http.Response response = await http.get(url);
if (response.statusCode == 200) {
  var json = jsonDecode(response.body); 
}

我已阅读The engine architecture这表明引擎中有4个线程

  • 平台任务运行程序
  • UI 任务运行器
  • GPU 任务运行程序
  • IO 任务运行程序

主应用程序 dart 代码在 UI Task Runner 线程上运行。 IO任务运行器似乎只是让dart引擎读取图像处理耗时的图像IO而不是应用程序IO发生的地方?

我知道 IO 库具有基于 Future 的无阻塞接口(interface),因此我提供给 IO 库的回调将在 UI 线程上运行,但实际 IO 操作本身是否存在 Dart VM 正在使用的操作系统线程进行这些操作?

例如,如果我尝试上传/下载 800MB 视频文件,Dart VM 是否使用后台 IO 线程来执行实际 IO?

是否应该使用单独的隔离来进行大型 IO 操作,例如上传/下载大文件?

最佳答案

Dart 使用线程池处理 IO 请求。为了找到答案,我必须克隆 Dart SDK 并查看源代码,因为我无法从文档中找到答案。

当调用 IO 方法时,会调用 File 实现 _File 类方法。它创建一个到 native 代码的端口 (IOService_NewServicePort) 并将 IO 请求 id 和 args 发送到 native 代码。 native 代码使用线程池( runtime\vm\native_api_impl.cc#Dart_NewNativePort )处理 IO 请求,将任务提交到线程池中。然后 native 代码一路返回到 Dart 代码,并且 _File 返回一个 future 对象。 IO操作完成后,通过之前创建的端口将结果从native发送回Dart。这会触发在端口上注册的处理程序,并解决 future 问题。

关于flutter - flutter 在什么线程/隔离上运行 IO 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56906744/

相关文章:

regex - 对 Dart 中的 `(?=)` 正则表达式感到困惑?我知道这是前瞻性的。正文中的更多细节

function - Dart 中的类术语

requirejs - Dart2js : Is it possible to start Root Isolate from Javascript?

dart - dart 中单独隔离的最大内存量

flutter json_serializable tojson 无法正常工作

dart - 测试使用插件和平台 channel 的 Flutter 代码

flutter - 没有 Java 运行时,请求安装 : Mac OS, Flutter

dart - Flutter/Dart 错误 : Unexpected tag 0 (Nothing) in _MyAppState@16036154. 构建

dart - 您如何在Polymer Dart 1.0中监听自定义事件?

dart - 隔离代码未按预期工作