Dart 颤振与未来
我可能对孤立和未来有错误的想法。请帮我把它弄清楚。以下是我对这两个主题的理解 隔离:在自己的事件循环中运行代码,每个事件可以在嵌套的微任务队列中运行较小的任务 Future:Future用于表示将来某个时间可用的潜在值或错误 我的困惑是:Dart 颤振与未来,dart,flutter,future,dart-isolates,Dart,Flutter,Future,Dart Isolates,我可能对孤立和未来有错误的想法。请帮我把它弄清楚。以下是我对这两个主题的理解 隔离:在自己的事件循环中运行代码,每个事件可以在嵌套的微任务队列中运行较小的任务 Future:Future用于表示将来某个时间可用的潜在值或错误 我的困惑是: 医生说隔离有自己的循环?我觉得拥有自己的事件队列对我来说更有意义,我错了吗 future是否在主服务器上异步运行?我假设将来的任务实际上被放置在事件队列的末尾,所以将来它是否将通过循环执行。如果我错了,请纠正我 如果有未来,为什么要使用隔离?我看到一些例子使用
Future
是一个句柄,允许您在异步执行完成时收到通知。
异步执行使用事件队列,代码在同一线程内并发执行
默认情况下,Dart代码在根目录中执行
您可以启动通常在另一个线程上运行的其他隔离。
隔离可以从根隔离启动时使用的相同Dart代码加载(使用与main()
)不同的入口点),也可以使用不同的Dart代码加载(从某些Dart文件或URL加载)
隔离不共享任何状态,只能使用消息传递(SendPort/ReceivePort)进行通信。每个隔离都有自己的事件队列
即使dart不是多线程的,也可以将隔离与线程进行比较。当Futures共享相同的内存时,它确实有自己的内存和事件循环 Dart能够生成独立进程,称为隔离进程(dart2js中的web工作者),当主程序在另一个进程中(实际上是某种线程)能够在不阻塞主线程的情况下执行计算时,这些进程不共享内存,但能够异步 未来是在称之为未来的隔离区内运行的,而不一定是主隔离区
我推荐这个比我解释得更好。用一句话我们可以说 隔离:Dart是单线程的,但它能够使用隔离(许多进程)执行多线程操作
Future:Future是dart完成异步工作后返回的结果。这项工作通常是在单线程中完成的 隔离在单个线程上运行Dart代码。同步类码
print('hello');
立即运行,不能被中断
隔离还具有一个事件循环,用于在其上调度异步任务。异步并不意味着这些任务在单独的线程上运行。它们仍然在同一线程上运行。异步只是意味着它们被安排在以后
事件循环运行在所谓的事件队列中调度的任务。您可以通过如下方式创建未来,将任务放入事件队列:
Future(() => print(hello));
事件队列中位于其前面的其他任务完成后,print(hello)
任务将运行。所有这些都发生在同一个线程上,即同一个隔离
例如,有些任务不会立即添加到事件队列
Future.delayed(Duration(seconds: 1), () => print('hello'));
仅在延迟1秒后才会添加到队列中
到目前为止,我所说的一切都是在同一个线程上完成的,同一个隔离。不过,有些工作实际上可能在不同的线程上完成,比如IO操作。底层框架负责这一点。如果在主隔离线程上执行了诸如从磁盘读取之类的昂贵操作,那么它将阻止应用程序,直到它完成。IO操作完成后,future将完成,并将带有结果的更新添加到事件队列中
当你需要自己做CPU密集型操作时,你应该在另一个隔离上运行它们,这样就不会在你的应用程序中引起jank。这房子对这个很有好处。您仍然使用future,但这一次future将从另一个隔离返回结果
进一步研究