【问题标题】:How to understand dart async operation?如何理解飞镖异步操作?
【发布时间】:2019-11-21 01:23:24
【问题描述】:

众所周知,dart 是一种单线程语言。所以根据文档,我们可以使用 Futrure/Stream 来实现异步操作。它将耗时的操作发送到事件队列。 让我感到困惑的是事件队列在哪里工作。它正在处理飞镖威胁?如果是,它将阻止该应用程序。 另一个问题是 Event Queue 一个 FIFO 队列。如果我有两个操作,一个是需要 1 分钟的网络请求,另一个是点击事件。这两个操作将发送到事件队列。 那么如果点击事件会被网络请求阻止呢?因为队列是FIFO队列? 那么事件队列在哪里工作呢? 非常感谢!

【问题讨论】:

    标签: ios dart


    【解决方案1】:

    需要注意的一点是异步和多线程是两个不同的东西。 Dart 使用 Futures 和 async/await 来实现异步,但 Dart 本质上仍然是一种单线程语言。

    它的工作方式是在创建 Future 时(手动或通过调用 async 方法),该进程被添加到事件队列中,正如您所阅读的那样。然后,在所有同步执行的中间,只要有间歇,事件队列就可以优先处理。然后它可以通过这些过程并确定是否有任何期货已经完成。如果是这样,则将结果传递给正在等待该资源的任何其他异步进程(如果有)。

    这也意味着,是的,如果您的程序在异步操作的中间挂起(通过while (true) {} 的无限循环的简单示例),它将冻结整个程序,包括同步代码和其他异步仍在等待解决的进程(即使允许它们解决的条件已经发生)。

    但是,就您而言,这不是问题。如果您以网络请求的形式触发一个异步过程,然后以“点击事件”的形式触发另一个过程(不确定您指的是什么,但我假设它也是异步的),它们都将是按该顺序添加到事件队列中。但是如果 click 事件在网络请求之前解决,事件队列只会识别到网络请求 Future 尚未解决,并将继续处理已解决的 click 事件。

    作为旁注,值得注意的是,Dart 确实具有多线程能力,尽管是以一种相当迂回的方式。 Dart 有一个叫做 Isolate 的东西,它不是一个线程,而是一个完全独立的子程序。这意味着 Isolate 无法访问内存中与根程序本身相同的任何数据。但是,可以使用SendPorts 和ReceivePorts 在两者之间传递数据。这使得使用 Isolate 比线程稍微复杂一些,但这也意味着,如果没有共享内存,它实际上消除了基于哪个线程首先访问内存的竞争条件。

    【讨论】:

    • 感谢您的回复。如您所说,如果使用 while (true) {} 进行异步操作,它将冻结整个程序。因此,如果我使用 Future 下载一个大文件,然后我点击一个按钮。所以按钮不会响应?
    • @porthuas 文件的下载将在后台进行,由平台的任何底层 HTTP 组件处理。在这种情况下,Future 的目的是在文件下载完成时通知您的代码,而不是处理下载过程本身。除非您使用的 HTTP 模块设计得非常糟糕,否则进行 HTTP 调用(例如下载文件)的行为不会导致程序在等待其完成时挂起。
    • @Abion47 明白了!那么如果事件队列有两个事件 A 和 B ,A会阻塞B吗?对吗?
    • @porthuas 您似乎认为事件队列一次只能处理一个 Future,等待一个完成后再移动到下一个。在每个事件循环中,所有期货都得到处理。事件队列仅描述了 Future 将被处理的 顺序,即使“处理”只是意味着识别 Future 尚未完成。如果队列中 A 在 B 之前,但 B 先完成,A 不会阻塞 B。
    • 谢谢!我编写了以下代码,输出为 getTest->test->getTest2。你能解释一下吗。 main(List<String> args) { print("main function start"); var b = getTest(); var b1 = getTest2(); b1.then((v){ print(v); }); b.then((v){ print(v); }); print("main function end"); } Future<String> getTest() { return Future<String>(() { for(var i = 0; i< 1000000; i++){ print(i); } return "getTest"; }); } Future<String> getTest2() { return Future<String>(() { print("test"); return "getTest2"; }); }
    猜你喜欢
    • 2021-11-28
    • 2020-11-28
    • 1970-01-01
    • 2023-03-31
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2018-08-14
    相关资源
    最近更新 更多