首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤振隔离与未来

颤振隔离与未来
EN

Stack Overflow用户
提问于 2018-09-25 12:57:25
回答 4查看 10.6K关注 0票数 25

我可能对孤立和未来有错误的看法。请帮我把它弄清楚。这是我对这两门学科的理解。

隔离:分离株在自己的事件循环中运行代码,每个事件可以在嵌套的微任务队列中运行较小的任务。

未来:未来是用来表示一个潜在的值,或错误,将在未来的某个时候可用。

我的困惑是:

  1. 医生说隔离有自己的循环?我觉得有自己的事件队列对我来说更有意义,我错了吗?
  2. 未来是否在主隔离上异步运行?我假设未来的任务实际上被放置在事件队列的末尾,所以如果它将来会被循环执行的话。如果我错了就纠正我。
  3. 当有未来的时候,为什么要使用隔离?我看到了一些示例,将隔离用于一些繁重的任务,而不是未来。但是为什么呢?只有当将来在主隔离队列上异步执行时,这才对我有意义。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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)进行通信。每个隔离器都有自己的事件队列。

https://webdev.dartlang.org/articles/performance/event-loop

票数 22
EN

Stack Overflow用户

发布于 2020-06-06 09:52:59

隔离器在单个线程上运行Dart代码。同步码

代码语言:javascript
复制
print('hello');

立即运行,不能被中断。

隔离器还具有一个事件循环,用于调度异步任务。异步并不意味着这些任务在单独的线程上运行。它们仍然运行在同一个线程上。异步只意味着它们被安排在稍后的时间。

事件循环运行在所谓的事件队列中调度的任务。通过创建这样的未来,您可以将任务放入事件队列:

代码语言:javascript
复制
Future(() => print(hello));

当事件队列中前面的其他任务完成时,print(hello)任务将被运行。所有这些都发生在同一个线程上,也就是相同的隔离点上。

有些任务没有立即添加到事件队列中,例如

代码语言:javascript
复制
Future.delayed(Duration(seconds: 1), () => print('hello'));

它只在延迟1秒后才被添加到队列中。

到目前为止,我所说的每一件事都是在同一个线程上完成的,同样的隔离。但是,有些工作实际上可能是在另一个线程上完成的,比如IO操作。底层框架解决了这一问题。如果在主隔离线程上做了一些昂贵的事情,比如从磁盘读取,那么它会阻塞应用程序,直到它完成。当IO操作完成后,将来将完成,并将带有结果的更新添加到事件队列中。

当您需要自己执行CPU密集型操作时,您应该在另一个隔离点上运行它们,这样就不会在您的应用程序中造成jank。计算属性对此很好。您仍然使用未来,但这一次,未来将返回来自不同隔离的结果。

进一步研究

票数 12
EN

Stack Overflow用户

发布于 2018-09-25 18:13:59

在一句话中我们可以说,

分离:Dart是单线程的,但它能够使用分离(许多进程)执行多线程操作。

未来:未来是在dart完成异步工作后返回的结果。这项工作一般是在那个单线程中完成的。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52498773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档