我可能对孤立和未来有错误的看法。请帮我把它弄清楚。这是我对这两门学科的理解。
隔离:分离株在自己的事件循环中运行代码,每个事件可以在嵌套的微任务队列中运行较小的任务。
未来:未来是用来表示一个潜在的值,或错误,将在未来的某个时候可用。
我的困惑是:
发布于 2018-09-25 13:03:58
Future是一个句柄,允许您在异步执行完成时得到通知。异步执行使用事件队列,代码在同一个线程中并发执行。
https://webdev.dartlang.org/articles/performance/event-loop
默认情况下,Dart代码是在根隔离中执行的。
您可以启动通常在另一个线程上运行的其他隔离。可以从根隔离启动时使用的同一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)进行通信。每个隔离器都有自己的事件队列。
发布于 2020-06-06 09:52:59
隔离器在单个线程上运行Dart代码。同步码
print('hello');立即运行,不能被中断。
隔离器还具有一个事件循环,用于调度异步任务。异步并不意味着这些任务在单独的线程上运行。它们仍然运行在同一个线程上。异步只意味着它们被安排在稍后的时间。
事件循环运行在所谓的事件队列中调度的任务。通过创建这样的未来,您可以将任务放入事件队列:
Future(() => print(hello));当事件队列中前面的其他任务完成时,print(hello)任务将被运行。所有这些都发生在同一个线程上,也就是相同的隔离点上。
有些任务没有立即添加到事件队列中,例如
Future.delayed(Duration(seconds: 1), () => print('hello'));它只在延迟1秒后才被添加到队列中。
到目前为止,我所说的每一件事都是在同一个线程上完成的,同样的隔离。但是,有些工作实际上可能是在另一个线程上完成的,比如IO操作。底层框架解决了这一问题。如果在主隔离线程上做了一些昂贵的事情,比如从磁盘读取,那么它会阻塞应用程序,直到它完成。当IO操作完成后,将来将完成,并将带有结果的更新添加到事件队列中。
当您需要自己执行CPU密集型操作时,您应该在另一个隔离点上运行它们,这样就不会在您的应用程序中造成jank。计算属性对此很好。您仍然使用未来,但这一次,未来将返回来自不同隔离的结果。
进一步研究
发布于 2018-09-25 18:13:59
在一句话中我们可以说,
分离:Dart是单线程的,但它能够使用分离(许多进程)执行多线程操作。
未来:未来是在dart完成异步工作后返回的结果。这项工作一般是在那个单线程中完成的。
https://stackoverflow.com/questions/52498773
复制相似问题