在Hack中,已解决的Awaitables的执行顺序是否明确定义?

时间:2017-01-11 01:00:29

标签: async-await hacklang

以下示例触发1000个异步usleep调用,间隔100μs,然后在join之前阻塞主线程:

<?hh
$awaitable = HH\Asio\v((new Vector(range(1, 1000)))->map((int $wait_time) ==> {
    return async {
        await HH\Asio\usleep($wait_time*100);
        echo $wait_time."\n";
    };
}));
usleep(1000000);
HH\Asio\join($awaitable);

The result in stdout (3v4l)表示控件返回async范围的顺序。

该程序始终将单调递减的序列从1000递增到1,这表明完成的Awaitables被推入堆栈并在线程以 LIFO顺序释放后弹出。这种排序是否真实,我可以依赖它吗?

3 个答案:

答案 0 :(得分:1)

这是故意未指定的,并且可能在将来发生变化 - 之前已经发生过变化。关于你可以依赖的异步函数的唯一问题是,在你await之后,他们已经执行并返回了他们的结果。

(例如,这也意味着你不应该依赖于调用异步函数但不立即await时发生的事情。)

答案 1 :(得分:0)

如果你依赖于收集或执行Awaitables的确切顺序,你可能做错了。

Awaitables应该用于IO。

你能解释一下为什么需要确切的订购?

答案 2 :(得分:-1)

是的,这个排序*是真实的,ready await handles are explicitly processed in LIFO order。但是,正如@ pablo-alcubilla写的那样,在它进入HHVM规范之前不应该依赖它,如果有的话。