2017-08-19 8 views
1

私はループ内に座ってコマンドを受け取るプロセスを持っています。Erlang受信***警告***

receive 
    increase -> 
     ... 
    decrease -> 
     ... 
    after 5000 -> 
     ... 
end 

しかし、何千ものメッセージでそれを爆撃すると、これらの警告が壊れて受信されます。

警告メッセージ:

***WARNING*** Unexp msg {<0.106.0>,rec_acked}, info {running, 
                [{'_UserConnections',20}], 
                {ieval,3994,34,log, 
                 clientLogging, 
                 [20], 
                 false}} 

は、これを処理するためにとにかくありますか?それは問題を引き起こしますか?

ありがとうございました!

+0

この警告をトリガするテストケースを減らすことができますか?これは私がこの正確な警告を見つけることができる唯一の例です:https://github.com/erlang/otp/blob/770454f0a32fbc0714c6762ed3e4d761b799814f/lib/debugger/src/dbg_icmd.erl#L225-L226。なぜそのプロセスが 'rec_acked'メッセージを受信して​​いるのか不明です。 – Dogbert

+0

約1000以上のプロセスが1つのPID(ループ)にメッセージを送信すると起こります。 – Mike5050

+3

これをトリガーする条件がいくつか追加されている必要があります。私はちょうど2000年の産卵プロセスから2000のメッセージを1つのプロセスに送りました。警告メッセージはありませんでした(合計400万メッセージ)。メインプロセスがメッセージを処理していないため、Erlang VMは現在500MB以上のRAMを使用しています。 – Dogbert

答えて

3

このコードは実例と実践には適していますが、運用環境では実行しないでください。
プロセスメールボックスからのすべてのメッセージを常に受信し、取得後に必要なものを選択する必要があります。

handle_message() -> 
    receive 
     Msg -> 
      handle_message(Msg) 
    after 5000 -> 
      handle_timeout() 
    end. 

handle_message(increase) -> 
    ...; 
handle_message(decrease) -> 
    ...; 
handle_message(_) -> 
    %% Back to receiving loop 
    handle_message(). 

プロセスのメールボックスがいっぱいにならないようにしてください。
生産準備アプリケーションでは、receiveステートメントを使用しないことがよくあります。多くの場合、受信、タイムアウト、返信、ハイバネーションなどの標準コードを使用します。これらのコードはの動作と呼ばれます。たとえばOTPスタンダードビヘイビアの1つgen_server behavior
OTPの振る舞いは、特別な義務を行うための非常に効率的なコードが必要な場合には、Special processという名前のものを書く必要があります。

+0

ありがとう!私はgen_serverのベアボーンがちょうどループ受信だったという仮定の下にいたのですか?また、どのようにしてプロセスのメールボックスを埋めるのを防ぐのですか?あなたが推測できるように、コードは接続されているユーザーを増減します。 – Mike5050

+0

また、答えで、私はまだこれらのメッセージを得る! – Mike5050

+0

コードを表示できますか? 1つのプロセスにメッセージを送信するだけですか? – Pouriya

関連する問題