【问题标题】:What thread / isolate does flutter run IO operations on?Flutter 在哪个线程/隔离上运行 IO 操作?
【发布时间】:2019-11-16 07:20:02
【问题描述】:

例如在使用 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 任务运行线程上运行。 IO 任务运行器似乎只供 dart 引擎读取图像处理耗时的图像 IO,而不是应用程序 IO 发生的位置?

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

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

是否应该为上传/下载大文件等大型 IO 操作使用单独的隔离?

【问题讨论】:

    标签: flutter dart dart-isolates


    【解决方案1】:

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

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

    【讨论】:

    • 因此对于长时间运行的 IO 操作,无需设置单独的隔离。 dart vm 创建的 IO 线程池有多大?
    • 线程池实现位于 runtime/vm/thread_pool.cc。似乎它没有最大线程限制,当空闲线程无法处理任务时,它会创建新线程来处理它。如果一个线程空闲了一段时间,它就会关闭。就像 java 中的 CachedThreadPool 一样。
    猜你喜欢
    • 2019-09-26
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多