Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 颤振与未来_Dart_Flutter_Future_Dart Isolates - Fatal编程技术网

Dart 颤振与未来

Dart 颤振与未来,dart,flutter,future,dart-isolates,Dart,Flutter,Future,Dart Isolates,我可能对孤立和未来有错误的想法。请帮我把它弄清楚。以下是我对这两个主题的理解 隔离:在自己的事件循环中运行代码,每个事件可以在嵌套的微任务队列中运行较小的任务 Future:Future用于表示将来某个时间可用的潜在值或错误 我的困惑是: 医生说隔离有自己的循环?我觉得拥有自己的事件队列对我来说更有意义,我错了吗 future是否在主服务器上异步运行?我假设将来的任务实际上被放置在事件队列的末尾,所以将来它是否将通过循环执行。如果我错了,请纠正我 如果有未来,为什么要使用隔离?我看到一些例子使用

我可能对孤立和未来有错误的想法。请帮我把它弄清楚。以下是我对这两个主题的理解

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

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将从另一个隔离返回结果

    进一步研究

    隔离物就像线一样。期货并非如此。因此,如果你有昂贵的计算,未来仍然会阻塞UI,但隔离将不会。dart是否允许我们像Java一样拥有主线程和后台线程?dart中没有真正的线程。隔离运行在不同的OS线程上,但是它们与Java线程(没有共享状态)有很大的不同。代码是单线程执行的(没有额外的隔离),同步代码总是在执行另一个回调之前运行到底。当你说隔离在不同的OS线程上运行时,这是否意味着每个隔离都有自己的事件循环,事件队列和微任务队列?是的,正如我在回答中提到的。从没有ReceivePort和SendPort的隔离中检索数据可以吗?比如说,将获得的数据存储到一个已经存在的变量中?@IvánYoed,我实际上还没有尝试过,但理论上它不应该工作,因为隔离不共享内存。不过,如果你能做到这一点,我想看看你的例子。我最近发布了一个关于这一点的问题,并得到了一个很好的答案。也许这是你感兴趣的@IvánYoed,谢谢!