下面的示例触发了 1000 个异步usleep
调用,以 100μs 分隔,然后在join
ing 之前阻塞主线程:
<?hh
$awaitable = HHAsiov((new Vector(range(1, 1000)))->map((int $wait_time) ==> {
return async {
await HHAsiousleep($wait_time*100);
echo $wait_time."n";
};
}));
usleep(1000000);
HHAsiojoin($awaitable);
标准输出 (3v4l) 中的结果指示控件返回到async
范围的顺序。
该程序始终如一地吐出从 1000 到 1 的单调递减序列,这表明完成的Awaitables
被推到堆栈上,并在线程以 LIFO 顺序释放后弹出。这个订单是真的吗,我可以依赖它吗?
这是故意不指定的,将来可能会改变 - 并且之前已经改变过。关于异步函数,您唯一可以依赖的是,在您await
它们之后,它们已经执行并返回了结果。
(这也意味着,例如,你不应该依赖于调用异步函数时会发生什么,但不要立即await
它。
如果您依赖于收集或执行Awaitables
的确切顺序,则可能做错了什么。
Awaitables
应该用于 IO。
您能解释一下为什么需要精确订购吗?
是的,此排序 * 是真实的,因为就绪等待句柄按 LIFO 顺序显式处理。然而,正如@pablo-alcubilla所写,在它进入HHVM规范之前,不应该依赖它,如果有的话。