例如,使用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 Task Runner线程上运行。IO任务运行程序似乎仅用于飞镖引擎读取图像来处理耗时的图像IO,而不是应用程序IO发生的地方?
我了解IO库具有基于Future的无阻塞接口,因此我提供给IO库的回调将在UI线程上运行,但是实际的IO操作本身又有Dart VM正在使用的OS线程来执行这些操作操作?
例如,如果我尝试上传/下载800MB视频文件,那么Dart VM使用的后台IO线程是否有实际的IO?
是否应将单独的隔离区用于大型IO操作(如上载/下载大文件)?
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。这将触发在端口上注册的处理程序,并且将来会解决。
_File
IOService_NewServicePort
runtime\vm\native_api_impl.cc#Dart_NewNativePort