dart:io 同步与异步文件操作

Posted

技术标签:

【中文标题】dart:io 同步与异步文件操作【英文标题】:dart:io sync vs async file operations 【发布时间】:2020-07-24 22:24:25 【问题描述】:

files in dart:io 有许多同步和异步操作:

file.deleteSync()file.delete() file.readAsStringSync()file.readAsString() file.writeAsBytesSync(bytes)file.writeAsBytes(bytes) 还有很多很多。

在同步和异步选项之间进行选择时,我应该牢记哪些注意事项?我似乎记得在某处看到同步选项更快,如果您必须等待它完成(例如await file.delete())。但我不记得我在哪里看到的,也不记得这是不是真的。

这个方法有什么区别:

Future deleteFile(File file) async 
  await file.delete();
  print('deleted');

还有这个方法:

Future deleteFile(File file) async 
  file.deleteSync();
  print('deleted');

【问题讨论】:

仅在您确定它将在几毫秒内完成而不是更长的情况下使用 sync 变体 @pskink,即使我在异步方法中? 是的,当然,您认为您可以创建for(var i=0; i<99999999999999999999999999999;i++) 并且该循环会以某种方式工作而不会阻塞您的应用程序吗?在 dart 中,默认情况下,一切都在一个线程中运行 - medium.com/@parthdave93/… 当然还有第 1 部分:medium.com/@parthdave93/single-thread-dart-what-ccbca2543ae9 aha,顺便说一句,使用Isolates 有一个很好的课程:IsolateChannel 它为您提供Stream / SinkIsolate 的2 路通信通道 - 这样您就可以例如,使用Sink.add 提交新任务以进行繁重的处理,Isolate 可以通过Stream 返回结果,您可以通过listen() 【参考方案1】:

让我尝试根据我的问题的 cmets 总结一个答案。纠正我的错误。

async 方法中运行代码不会使其在另一个线程上运行。 Dart 是一个单线程系统。 代码在事件循环中运行。 无论是否采用异步方法,执行长时间运行的同步任务都会阻塞系统。 隔离是一个单线程。 如果您想在另一个线程上运行任务,那么您需要在另一个隔离上运行它。 启动另一个隔离区称为生成隔离区。 有几个选项可用于在另一个隔离区上运行任务,包括 computeIsolateChannel 和 writing your own isolate communication code。 对于文件 IO,同步版本比异步版本快。 对于繁重的文件 IO,更喜欢异步版本,因为they work on a separate thread。 对于轻量级文件 IO(如 file.exists()?),可以选择使用同步版本,因为它可能会很快。

进一步阅读

Isolates and Event Loops Single Thread Dart, What? — Part 1 Single Thread Dart, What? — Part 2 avoid_slow_async_io lint

【讨论】:

这是否意味着不需要为异步file.writeAsBytes(bytes) 操作生成单独的隔离,因为它会自动在单独的线程上工作? @SergeyMolchanovsky,是的,这是我的理解。

以上是关于dart:io 同步与异步文件操作的主要内容,如果未能解决你的问题,请参考以下文章

同步异步阻塞非阻塞与服务器

Python基础学习 -- 同步与异步操作

Python基础学习 -- 同步与异步操作

架构笔记[一]:同步与异步

10张图教你同步与异步(转载)

JavaScript 系列八:同步与异步