以下示例触发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顺序释放后弹出。这种排序是否真实,我可以依赖它吗?
答案 0 :(得分:1)
这是故意未指定的,并且可能在将来发生变化 - 之前已经发生过变化。关于你可以依赖的异步函数的唯一问题是,在你await
之后,他们已经执行并返回了他们的结果。
(例如,这也意味着你不应该依赖于调用异步函数但不立即await
时发生的事情。)
答案 1 :(得分:0)
如果你依赖于收集或执行Awaitables
的确切顺序,你可能做错了。
Awaitables
应该用于IO。
你能解释一下为什么需要确切的订购?
答案 2 :(得分:-1)
是的,这个排序*是真实的,ready await handles are explicitly processed in LIFO order。但是,正如@ pablo-alcubilla写的那样,在它进入HHVM规范之前不应该依赖它,如果有的话。