Dart:无法理解 async/awaut、Future 和 Event 循环如何协同工作
Dart: Can't understand how async/awaut, Future and Event loop work together
我是 Dart 新手。正如我从一些文章和文档中了解到的(例如 this article):
async/await
使用与Future
相同的机制,即先进先出Event Loop
。
Event Loop
在 main()
执行后启动。
async
函数运行 同步 直到第一个 await
关键字。然后他们暂停执行,并执行returns到调用堆栈中的上一个函数。
- 剩下的代码被包装到
Future
并排队到 Event Loop
(对我来说最不确定的一点)。
基于我期望的这些点,以下代码:
main() {
Future(() => print("1"));
Future(() {
print("2");
asyncFunc("2");
});
Future(() => print("3"));
print("main");
asyncFunc("main");
print("\nEvent loop starts?\n");
}
asyncFunc(String from) async {
print("start [from $from]");
await (() async => print("middle [from $from]"))();
print("end [from $from]");
}
将在 main() 执行后创建类似于此事件队列的内容:
future1
-> future2
-> future3
-> end_from_main
而在future2
执行后,事件end_from_future2
会排到最后:
future1
-> future2
-> future3
-> end_from_main
-> end_from_future2
所以我期望的结果输出应该是:
main
start [from main]
middle [from main]
Event loop starts?
1
2
start [from 2]
middle [from 2]
3
end [from main]
end [from 2]
但实际上它returns:
main
start [from main]
middle [from main]
Event loop starts?
end [from main]
1
2
start [from 2]
middle [from 2]
end [from 2]
3
所以我得出的结论是:async/await
个事件优先于 Fututre
个事件。他们要么使用不同的机制,与 EventLoop
无关。或者也许我几乎没有误解什么..
我认为我理解的是:
Future
可以代表 Event queue
中的 events,或者 Microtask queue
中的 tasks。
(例如:默认 Future()
构造函数将 event 放入 Event queue
,Future.microtask()
将 task 放入 Microtask queue
)
await
创建 Future.than
回调以接收 Future
。
我的题目示例解释:
- 前三个
Futrue
将 事件 放入 Event queue
。
Future<void>
在 await (() async => print("asyncFunc middle"))()
中创建 隐式 在 Microtask queue
中创建“空”任务 (我假设所有 implicit Future
都被安排到 Microtask queue
)。比 await
将剩余指令 (print("end [from main]")
) 作为 Future.than
回调到此“空”任务.
- 当涉及到
Event Loop
时,它首先执行来自 Microtask queue
的“空”任务。以回调结束:print("end [from main]")
.
- 并且比
Event loop
执行 Event queue
,其中第二个 事件 在 Microtask queue
。这就是为什么 end [from 2]
发生在第三个 Future
之前
我是 Dart 新手。正如我从一些文章和文档中了解到的(例如 this article):
async/await
使用与Future
相同的机制,即先进先出Event Loop
。Event Loop
在main()
执行后启动。async
函数运行 同步 直到第一个await
关键字。然后他们暂停执行,并执行returns到调用堆栈中的上一个函数。- 剩下的代码被包装到
Future
并排队到Event Loop
(对我来说最不确定的一点)。
基于我期望的这些点,以下代码:
main() {
Future(() => print("1"));
Future(() {
print("2");
asyncFunc("2");
});
Future(() => print("3"));
print("main");
asyncFunc("main");
print("\nEvent loop starts?\n");
}
asyncFunc(String from) async {
print("start [from $from]");
await (() async => print("middle [from $from]"))();
print("end [from $from]");
}
将在 main() 执行后创建类似于此事件队列的内容:
future1
-> future2
-> future3
-> end_from_main
而在future2
执行后,事件end_from_future2
会排到最后:
future1
-> future2
-> future3
-> end_from_main
-> end_from_future2
所以我期望的结果输出应该是:
main
start [from main]
middle [from main]
Event loop starts?
1
2
start [from 2]
middle [from 2]
3
end [from main]
end [from 2]
但实际上它returns:
main
start [from main]
middle [from main]
Event loop starts?
end [from main]
1
2
start [from 2]
middle [from 2]
end [from 2]
3
所以我得出的结论是:async/await
个事件优先于 Fututre
个事件。他们要么使用不同的机制,与 EventLoop
无关。或者也许我几乎没有误解什么..
我认为我理解的是:
Future
可以代表Event queue
中的 events,或者Microtask queue
中的 tasks。
(例如:默认Future()
构造函数将 event 放入Event queue
,Future.microtask()
将 task 放入Microtask queue
)await
创建Future.than
回调以接收Future
。
我的题目示例解释:
- 前三个
Futrue
将 事件 放入Event queue
。 Future<void>
在await (() async => print("asyncFunc middle"))()
中创建 隐式 在Microtask queue
中创建“空”任务 (我假设所有 implicitFuture
都被安排到Microtask queue
)。比await
将剩余指令 (print("end [from main]")
) 作为Future.than
回调到此“空”任务.- 当涉及到
Event Loop
时,它首先执行来自Microtask queue
的“空”任务。以回调结束:print("end [from main]")
. - 并且比
Event loop
执行Event queue
,其中第二个 事件 在Microtask queue
。这就是为什么end [from 2]
发生在第三个Future
之前