実行中のコアで次の機能がブロックされていますか?ERLANG wait()とブロッキング
素晴らしい答えは、erlangおよび/またはcpuの内部作業の詳細です。
wait(Sec) ->
receive
after (1000 * Sec) -> ok
end.
実行中のコアで次の機能がブロックされていますか?ERLANG wait()とブロッキング
素晴らしい答えは、erlangおよび/またはcpuの内部作業の詳細です。
wait(Sec) ->
receive
after (1000 * Sec) -> ok
end.
そのコードを実行するプロセス意志ブロック、現在をそのプロセスを実行するスケジューラがわけではないブロック。投稿したコードは、利回りと同じですが、タイムアウトがあります。
そのコアのErlang VMスケジューラは、そのタイムアウトが発生するまで他のプロセスの実行を継続し、そのプロセスの実行が再度スケジュールされます。
短い回答:現在の(軽量)プロセスのみをブロックし、すべてのVMをブロックしません。詳細については、erlangスケジューラを参照する必要があります。ニースの説明はFrancesco CesariniとSimon Thompsonの著書「Concurent Programming」から来ています。プロセスがディスパッチされると
...スニップ... は、実行を許可され †減少の数、実行毎 動作のために低減される番号が割り当てられます。プロセスが受信句 に入り、メッセージのいずれも一致しないか、またはその削減カウントが ゼロに達するとすぐに、それは先取りされます。 BIFが実行されていない限り、この 戦略は、プロセス間で公平な(しかし等しくない)割り当てを実行時間として実行します( )。 ... snip ...
何もありませんErlang特有のかなり古典的な問題:タイムアウトはシステムクロック割り込みでのみ発生します。上記と同じ答え:そのプロセスがクロック割り込みを待ってブロックされ、他のすべてがうまくいきます。
プロセスが待機する実際の時間については、クロック周期(システムに依存します)に依存しますが、それは別のトピックであるため正確ではありません。
NodeJSの 'setTimeout'に相当するerlangはありますか?現在のスレッドで非ブロックです。 – CMCDragonkai
@CMCDragonkai:受信時にブロックするか(タイムアウトの有無にかかわらず)、そうでない場合はブロックします。タイムアウトを '0'に設定することで、 'receive'コールの間で作業をスケジュールすることができます。これは本質的にあなたの受信箱をチェックし、空であれば作業を継続することを意味します。たとえば、['send_after/3'](http://erlang.org/doc/man/erlang.html#send_after-3)などを使用して、より高度なチェックをスケジュールすることもできます。 –