2012-01-24 14 views
6

実行中のコアで次の機能がブロックされていますか?ERLANG wait()とブロッキング

素晴らしい答えは、erlangおよび/またはcpuの内部作業の詳細です。

wait(Sec) -> 
    receive 
    after (1000 * Sec) -> ok 
    end. 

答えて

7

そのコードを実行するプロセス意志ブロック、現在をそのプロセスを実行するスケジューラがわけではないブロック。投稿したコードは、利回りと同じですが、タイムアウトがあります。

そのコアのErlang VMスケジューラは、そのタイムアウトが発生するまで他のプロセスの実行を継続し、そのプロセスの実行が再度スケジュールされます。

+0

NodeJSの 'setTimeout'に相当するerlangはありますか?現在のスレッドで非ブロックです。 – CMCDragonkai

+0

@CMCDragonkai:受信時にブロックするか(タイムアウトの有無にかかわらず)、そうでない場合はブロックします。タイムアウトを '0'に設定することで、 'receive'コールの間で作業をスケジュールすることができます。これは本質的にあなたの受信箱をチェックし、空であれば作業を継続することを意味します。たとえば、['send_after/3'](http://erlang.org/doc/man/erlang.html#send_after-3)などを使用して、より高度なチェックをスケジュールすることもできます。 –

2

短い回答:現在の(軽量)プロセスのみをブロックし、すべてのVMをブロックしません。詳細については、erlangスケジューラを参照する必要があります。ニースの説明はFrancesco CesariniとSimon Thompsonの著書「Concurent Programming」から来ています。プロセスがディスパッチされると

...スニップ... は、実行を許可され †減少の数、実行毎 動作のために低減される番号が割り当てられます。プロセスが受信句 に入り、メッセージのいずれも一致しないか、またはその削減カウントが ゼロに達するとすぐに、それは先取りされます。 BIFが実行されていない限り、この 戦略は、プロセス間で公平な(しかし等しくない)割り当てを実行時間として実行します( )。 ... snip ...

1

何もありませんErlang特有のかなり古典的な問題:タイムアウトはシステムクロック割り込みでのみ発生します。上記と同じ答え:そのプロセスがクロック割り込みを待ってブロックされ、他のすべてがうまくいきます。

プロセスが待機する実際の時間については、クロック周期(システムに依存します)に依存しますが、それは別のトピックであるため正確ではありません。

関連する問題