扑孤立与未来

时间:2018-09-25 12:57:26

标签: dart flutter future dart-isolates

我可能对“孤立与未来”有错误的认识,请帮助我清除它。这是我对这两个主题的理解。

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

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

我的困惑是:

  1. 医生说“隔离”有自己的循环吗?我觉得拥有自己的事件队列对我来说更有意义,我错了吗?

  2. 将来是否在主隔离上异步运行?我假设未来的任务实际上被放置在事件队列的末尾,所以如果将来它将通过循环执行。如果我错了,请纠正我。

  3. 为什么在将来有机会使用隔离?我看到了一些使用Isolate代替Future进行繁重任务的示例。但为什么?仅当将来在主隔离队列上异步执行时,这对我才有意义。

谢谢大家,感谢您的答复。

4 个答案:

答案 0 :(得分:6)

Future是一个句柄,可让您在异步执行完成时得到通知。 异步执行使用事件队列,并且代码在同一线程内并发执行。

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

默认情况下,Dart代码在根隔离目录中执行。

您可以启动通常在另一个线程上运行的其他隔离。 可以从启动根隔离的同一Dart代码加载隔离(使用与main() {{3}不同的入口点),也可以使用不同的Dart代码加载(从某些Dart文件或URL { {3}}。

隔离不共享任何状态,只能使用消息传递(SendPort / ReceivePort)进行通信。每个隔离都有自己的事件队列。

https://api.dartlang.org/stable/2.0.0/dart-isolate/Isolate/spawn.html

答案 1 :(得分:4)

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

之类的同步代码
print('hello');

立即运行,不会被中断。

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

事件循环运行在事件队列中安排的任务。您可以通过创建像这样的未来来将任务放入事件队列:

Future(() => print(hello));

print(hello)任务将在事件队列中前面的其他任务完成后运行。所有这些都发生在同一线程上,即同一隔离。

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

Future.delayed(Duration(seconds: 1), () => print('hello'));

仅在延迟一秒钟后才添加到队列中。

到目前为止,我一直在谈论的所有内容都在同一线程,同一隔离上完成。但是,实际上可能会在其他线程上完成一些工作,例如IO操作。底层框架负责这一点。如果在主Isolate线程上完成了诸如从磁盘读取之类的昂贵工作,则它将阻塞应用程序直到完成。 IO操作完成后,将来的操作会完成,并将结果更新添加到事件队列中。

当您需要自己进行CPU密集型操作时,应在另一个隔离环境上运行它们,以免在应用程序中造成混乱。 compute属性对此很有用。您仍然使用future,但是这次future从另一个隔离中返回结果。

进一步学习

答案 2 :(得分:1)

即使dart不是多线程的,也可以将隔离与Thread进行比较。当期货共享相同的内存时,它确实具有自己的内存和事件循环

  

Dart能够产生称为Isolates(dart2js中的网络工作者)的独立进程,该进程在主程序执行时不共享内存,但是能够在另一个进程(实际上是一个线程)中异步执行计算而不会阻塞主线程。

Future在称为它的隔离中运行,而不必在主要隔离中运行。

我推荐的article比我有更好的解释。

答案 3 :(得分:1)

我们可以用一句话说

隔离:Dart是单线程的,但能够使用隔离(许多进程)来进行多线程处理。

未来:Future是dart完成异步工作后返回的结果。该工作通常在该单线程中完成。