2017-01-11 19 views
0

100のμ Sによって分離された1000回の非同期usleepコールオフ火災以下の例は、次にjoin ING前ブロックメインスレッド:解決済みのAwaitableの実行順序は、Hackでよく定義されていますか?

<?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スコープに戻す制御順序を示しています。

プログラムは、一貫して終了Awaitablesが一旦スレッドがLIFO順に解放され、スタックにプッシュとポップされることを示唆し、1000〜1まで単調減少シーケンスを吐き出します。この注文は本当ですか、私はそれに頼ることができますか?

答えて

-1

はい、この順序は* ready await handles are explicitly processed in LIFO orderとして、本物です。しかし、@ pablo-alcubillaが書いているように、それがHHVM仕様に入るまでそれは信頼されるべきではありません。

+0

これは、パフォーマンス上の理由のためのコードであるが、言語仕様はそれについて何も言わない。 –

+0

これに頼らないでください。これは意図的に指定されていないので、前に変更することができます。 –

0

あなたがAwaitables収集したり、実行中の正確な順序に依存している場合は、おそらく何か間違ったことをやっています。

AwaitablesはIOのために使用されることになっています。

正確な注文が必要な理由をもう少し説明できますか?

+0

元々、Observerの実装では、マージ操作(実際には私はFIFOを期待していました)で一貫した順序付けを使用できると思っていましたが、さらに昨日考えると一貫した順序だけでは十分強くありません。 – concat

0

これは意図的に指定されておらず、今後変更される可能性があります。信頼できる非同期関数の唯一のことは、awaitの後で実行して結果を返すことです。

(これはまた、あなたが非同期関数を呼び出すときに何が起こるかに依存していないが、それには、すぐにawaitない必要があること、例えば、を意味します。)

関連する問題