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,顺便说一句,使用Isolate
s 有一个很好的课程:IsolateChannel
它为您提供Stream
/ Sink
与Isolate
的2 路通信通道 - 这样您就可以例如,使用Sink.add
提交新任务以进行繁重的处理,Isolate
可以通过Stream
返回结果,您可以通过listen()
向
【参考方案1】:
让我尝试根据我的问题的 cmets 总结一个答案。纠正我的错误。
在async
方法中运行代码不会使其在另一个线程上运行。
Dart 是一个单线程系统。
代码在事件循环中运行。
无论是否采用异步方法,执行长时间运行的同步任务都会阻塞系统。
隔离是一个单线程。
如果您想在另一个线程上运行任务,那么您需要在另一个隔离上运行它。
启动另一个隔离区称为生成隔离区。
有几个选项可用于在另一个隔离区上运行任务,包括 compute
和 IsolateChannel
和 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 同步与异步文件操作的主要内容,如果未能解决你的问题,请参考以下文章