一尘不染

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

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); 
}

我已经通读了引擎架构该架构表明引擎中有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操作(如上载/下载大文件)?


阅读 237

收藏
2020-08-13

共1个答案

一尘不染

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

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

2020-08-13