Pan*_*rld 12 future dart dart-isolates flutter
我可能会对Isolate和Future有错误的想法,请帮我清理一下.以下是我对两个科目的理解.
隔离:在自己的事件循环中隔离运行代码,并且每个事件可以在嵌套的微任务队列中运行较小的任务.
未来:未来用于表示将来某个时间可用的潜在价值或错误.
我的困惑是:
文档说Isolate有它自己的循环?我觉得拥有自己的事件队列对我来说更有意义,我错了吗?
未来是否会在主Isolate上异步运行?我假设未来的任务实际上被放置在事件队列的末尾,所以如果它将来会循环执行.如我错了请纠正我.
为什么在有未来的时候使用Isolate?我看到一些使用Isolate的例子用于一些繁重的任务,而不是Future.但为什么?当将来在主隔离队列上异步执行时,它才对我有意义.
谢谢大家,感谢您的回复.
A Future
是一个句柄,允许您在异步执行完成时收到通知.异步执行使用事件队列,代码在同一个线程内并发执行.
https://webdev.dartlang.org/articles/performance/event-loop
默认情况下,Dart代码在根隔离中执行.
您可以启动通常在另一个线程上运行的其他隔离区.的分离物可以从相同达特代码根分离物开始(具有不同的入口点比被自动载入main()
https://api.dartlang.org/stable/2.0.0/dart-isolate/Isolate/spawn.html)或使用不同的Dart代码(从某些Dart文件或URL加载https://api.dartlang.org/stable/2.0.0/dart-isolate/Isolate/spawnUri.html).
隔离区不共享任何状态,只能使用消息传递进行通信(SendPort/ReceivePort).每个隔离区都有自己的事件队列.
https://webdev.dartlang.org/articles/performance/event-loop
我们可以用一句话说,
Isolates:Dart 是单线程的,但它能够使用 Isolates(许多进程)进行多线程处理。
Future : Future 是当 dart 完成异步工作时返回的结果。工作一般是在那个单线程中完成的。
Isolate 在单个线程上运行 Dart 代码。同步代码如
print('hello');
Run Code Online (Sandbox Code Playgroud)
立即运行并且不能被中断。
Isolate 也有一个事件循环,用于在其上调度异步任务。异步并不意味着这些任务在单独的线程上运行。它们仍然在同一个线程上运行。异步只是意味着它们被安排在以后。
事件循环运行在所谓的事件队列中安排的任务。您可以通过创建这样的未来将任务放入事件队列:
Future(() => print(hello));
Run Code Online (Sandbox Code Playgroud)
print(hello)
当事件队列中它前面的其他任务完成时,该任务将开始运行。所有这些都发生在同一个线程上,即同一个 Isolate。
例如,某些任务不会立即添加到事件队列中
Future.delayed(Duration(seconds: 1), () => print('hello'));
Run Code Online (Sandbox Code Playgroud)
它只会在延迟一秒后添加到队列中。
到目前为止,我一直在谈论的所有内容都在同一个线程上完成,同一个 Isolate。但是,某些工作实际上可能会在不同的线程上完成,例如 IO 操作。底层框架负责解决这个问题。如果在主 Isolate 线程上完成了诸如从磁盘读取之类的昂贵操作,那么它将阻塞应用程序直到它完成。当 IO 操作完成后,future 完成并且带有结果的更新被添加到事件队列中。
当您需要自己执行 CPU 密集型操作时,您应该在另一个隔离上运行它们,以免导致应用程序卡顿。在计算性能好这一点。您仍然使用未来,但这次未来将返回来自不同隔离区的结果。
归档时间: |
|
查看次数: |
2889 次 |
最近记录: |