It turns out that, thanks to the lack of proactive action to balance items for hot consumers, both HHReactor and AmpReactor suffer from the same issue. In Hack, although the scheduler "is stochastic", in 3.19 it's actually deterministic, which gives one synchronous consumer all the control when racing the others in the foreach-await.
On a side note, this seems to show that Awaitable subscribers are processed in FIFO order despite ready wait handles being processed in LIFO (as of HHVM 3.19 — subject to change).
It turns out that, thanks to the lack of proactive action to balance items for hot consumers, both HHReactor and AmpReactor suffer from the same issue. In Hack, although the scheduler "is stochastic", in 3.19 it's actually deterministic, which gives one synchronous consumer all the control when racing the others in the foreach-await.
See for yourself:
Notice how something like the following is balanced, thanks to random deferral: