flutter 运行 IO 操作在什么线程/isolate 上?
What thread / isolate does flutter run IO operations on?
在使用 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 任务运行器
UI Task Runner Thread 上的主应用 dart 代码 运行s。 IO任务运行ner似乎只是为了dart引擎读取图像处理耗时的图像IO而不是应用程序IO发生的地方?
我知道 IO 库有基于 Future 的无阻塞接口,所以我提供给 IO 库的回调将 运行 在 UI 线程上,但实际的 IO 操作本身是什么Dart VM 正在使用一个 OS 线程来执行这些操作?
例如,如果我尝试 upload/download 一个 800MB 的视频文件,是否有 Dart VM 使用的后台 IO 线程来执行实际的 IO?
上传/下载大文件等大型IO操作是否应该使用单独的隔离?
Dart 使用线程池处理 IO 请求。为了找到答案,我不得不克隆 Dart SDK 并查看源代码,因为我无法从文档中找到答案。
调用 IO 方法时,会调用 File 实现 _File
class 方法。它创建一个到本机代码的端口 (IOService_NewServicePort
),并将 IO 请求 ID 和参数发送到本机代码。本机代码使用线程池 (runtime\vm\native_api_impl.cc#Dart_NewNativePort
) 处理 IO 请求,将任务提交到线程池中。然后本机代码 returns 一直返回到 Dart 代码和 _File
returns 一个未来的对象。 IO操作完成后,结果通过之前创建的端口从native传回Dart。这会触发在端口上注册的处理程序,并且未来已解决。
在使用 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 任务运行器
UI Task Runner Thread 上的主应用 dart 代码 运行s。 IO任务运行ner似乎只是为了dart引擎读取图像处理耗时的图像IO而不是应用程序IO发生的地方?
我知道 IO 库有基于 Future 的无阻塞接口,所以我提供给 IO 库的回调将 运行 在 UI 线程上,但实际的 IO 操作本身是什么Dart VM 正在使用一个 OS 线程来执行这些操作?
例如,如果我尝试 upload/download 一个 800MB 的视频文件,是否有 Dart VM 使用的后台 IO 线程来执行实际的 IO?
上传/下载大文件等大型IO操作是否应该使用单独的隔离?
Dart 使用线程池处理 IO 请求。为了找到答案,我不得不克隆 Dart SDK 并查看源代码,因为我无法从文档中找到答案。
调用 IO 方法时,会调用 File 实现 _File
class 方法。它创建一个到本机代码的端口 (IOService_NewServicePort
),并将 IO 请求 ID 和参数发送到本机代码。本机代码使用线程池 (runtime\vm\native_api_impl.cc#Dart_NewNativePort
) 处理 IO 请求,将任务提交到线程池中。然后本机代码 returns 一直返回到 Dart 代码和 _File
returns 一个未来的对象。 IO操作完成后,结果通过之前创建的端口从native传回Dart。这会触发在端口上注册的处理程序,并且未来已解决。