解析的 Awaitables 的执行顺序是否在 Hack 中明确定义



下面的示例触发了 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规范之前,不应该依赖它,如果有的话。

相关内容

  • 没有找到相关文章

最新更新