2016-11-05 6 views
5

プールを維持するgen_serverプロセスがあります。受信リクエストごとに、この受信リクエストに一致するものがあるかどうかを調べる必要があります。一致するものがある場合は、一致するものがプールから削除されて返信されます両方の要求に対して行われます。もし存在しなければ、新しい要求は後の検査のためにプールに入れられる。Erlang:タイマーは大丈夫ですか?

ビズロジックがあることを必要とし、R、要求場合は、私は「私はあなたのための一致を見つけることができません」のようなものを言ってRへの返信を作成する必要があり、一致しなくてT秒間プールに座っています。

理想的には、私はタイマーでこれを行う必要があります。具体的には、到着したリクエストごとに、一致するものがない場合は以前と同じようにプールに入れますが、時間が来たらgen_serverにもちろん、それが後で一致する場合は、タイマーをキャンセルする必要があります。

私の懸念は、プールに不一致なリクエストが多数ある場合、実行中のタイマーがたくさんあることです。これは(タイマーが多すぎると)問題になるのでしょうか?

+1

すべてのタイマが同じように動作するわけではありませんが、私は 'timer:start'は一般に避けられ、パフォーマンス上のペナルティを受けていますが、何千ものプロセスで' erlang:send_after'を使うのが一般的です。 – Reith

+0

@Reith私は 'erlang:send_after'を使用しています –

答えて

6

R18でタイマーの実装が大幅に改善されました。

Besides the API changes and time warp modes a lot of 
    scalability and performance improvements regarding time 
    management has been made internally in the runtime system. 
    Examples of such improvements are scheduler specific timer 
    wheels, scheduler specific BIF timer management, parallel 
    retrieval of monotonic time and system time on systems with 
    primitives that are not buggy. 

スケジューラ特定のタイマーホイールシナリオで面白いですまさにです。私はあなたがErlangや他の言語/環境であなたの問題のより良い実行可能な解決策を巡って来るのではないかと疑います。したがって、R18以降を使用している場合は、解決策はOKです。

+1

ジョーアームストロングは数日前にCodeMeshで数万のプロセスを生成し、それぞれ特定の時間をスリープした後、単一のMIDIノートを再生するという例を示しました。完璧に働いた! :-) – RichardC

+1

ありがとう、Hynek -Pichi- Vychodil。 @リチャードC私もテストするために自分自身10Kタイマーを開始した、それはまばたきしません。 –

関連する問題