抖动在哪个线程/隔离上运行IO操作?

时间:2019-07-05 16:47:28

标签: flutter dart dart-isolates

使用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 Task Runner
  • IO任务运行器

主应用程序飞镖代码在UI Task Runner线程上运行。 IO任务运行程序似乎仅用于飞镖引擎读取图像来处理耗时的图像IO,而不是应用程序IO发生的位置?

我了解IO库具有基于Future的无阻塞接口,因此我提供给IO库的回调将在UI线程上运行,但实际的IO操作本身又是Dart VM正在使用的OS线程进行这些操作?

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

是否应将单独的隔离区用于大型IO操作(如上载/下载大文件)?

1 个答案:

答案 0 :(得分:5)

Dart使用线程池处理IO请求。为了找出答案,我不得不克隆Dart SDK并查看源代码,因为我找不到文档的答案。

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